Оказалось что предложенный код не умеет работать с папками в архиве. Мой посильный вклад:
if (UNZ_OK == unzGetCurrentFileInfo(zip_file, &fi,
filename, sizeof(filename), 0, 0, 0, 0))
{
if(fi.uncompressed_size)//file
{
if (UNZ_OK == unzOpenCurrentFile(zip_file))
{
UINT data_len = fi.uncompressed_size;
BYTE* file_data = new BYTE[data_len];
if (!file_data)
break;
if(data_len == unzReadCurrentFile(zip_file, file_data, data_len))
{
char file_path_name[MAX_PATH] = {0};
strcat(file_path_name, i_dest_dir.c_str());
strcat(file_path_name, "\\");
strcat(file_path_name, filename);
FILE* pFile = fopen(file_path_name, "wb");
if (pFile)
{
result = (data_len == fwrite(file_data, 1, data_len, pFile));
result = result && (0 == fclose(pFile));
}
}
delete [] file_data;
}
result = result && (UNZ_OK == unzCloseCurrentFile(zip_file));
}
else//dir
{
std::string new_dir = i_dest_dir;
new_dir += "\\";
new_dir += filename;
_mkdir(new_dir.c_str());
result = true;
}
}
Здравствуйте, Gosha, Вы писали:
G>Здравствуйте, Аноним, Вы писали:
А>>Кстати, вопрос в тему — как добавить в ZIP-архив пустую папку?
G>Не, не знаю. Не нужно было, не разбирался.
G>PS.
G>Вот ведь время летит... Оригинальному посту уже два года (!!!) стукнуло. А вроде как вчера писал
G>Раз уж тема всплыла, кидаю код с распаковщиком. Чуток отличается от прежнего, переделывался под нужды одной из прог. Функционал по минимуму — простые архивы кушает, без папок. Но всяко лучше чем ничего, может кому и пригодится.
G>Packer.h
G>G>#pragma once
G>#include <vector>
G>#include <string>
G>typedef std::vector<std::string> STR_VEC;
G>struct CPacker
G>{
G> //заархивировать файлы
G> BOOL Pack(STR_VEC& _files, const char* _zipName);
G> //разархивировать
G> BOOL Unpack(const char* _zipName, const char* _dstFolder);
G>};
G>
G>Packer.cpp
G>G>#include "StdAfx.h"
G>#include ".\packer.h"
G>#include ".\zlib\zip.h"
G>#include ".\zlib\unzip.h"
G>#include <sys/stat.h>
G>#include <time.h>
G>#pragma comment(lib, ".\\zlib\\zlib.lib")
G>#define READ_BUFFER_SIZE 65535
G>BOOL CPacker::Pack(std::vector<std::string>& _files, const char* _zipName)
G>{
G> BOOL result = false;
G> if ( 0 == _files.size())
G> return result;
G> STR_VEC::const_iterator Iter = _files.begin();
G> zipFile zipfile = zipOpen(_zipName, 0);
G> if (zipfile != NULL)
G> {
G> while (Iter != _files.end())
G> {
G> result = false;
G> const char* srcFullFileName = Iter->c_str();
G> const char* p = strrchr(srcFullFileName, '\\');
G> const char* srcFileName = (NULL == p) ? srcFullFileName : p + 1;
G> char read_buf[READ_BUFFER_SIZE];
G> FILE* file = fopen(srcFullFileName, "rb");
G> if (file != NULL)
G> {
G> zip_fileinfo zfileinfo = {0};
G> struct _stat file_stat = {0};
G> _fstat(_fileno(file), &file_stat);
G> struct tm* file_time = localtime(&file_stat.st_mtime);
G> tm_zip* zip_time = &zfileinfo.tmz_date;
G> memcpy(zip_time, file_time, sizeof(tm_zip));
G> int compression = Z_BEST_COMPRESSION;
G> if ( ZIP_OK == zipOpenNewFileInZip(zipfile, srcFileName,
G> &zfileinfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, compression))
G> {
G> while(!feof(file))
G> {
G> result = false;
G> size_t count = fread( read_buf, sizeof(char), READ_BUFFER_SIZE, file );
G> if(!ferror(file))
G> {
G> if ( ZIP_OK == zipWriteInFileInZip(zipfile, read_buf, count))
G> {
G> result = true;
G> continue;
G> }
G> else
G> break;
G> }else
G> break;
G> }
G> result = result && (Z_OK == zipCloseFileInZip(zipfile));
G> }
G> result = result && (0 == fclose(file));
G> }
G> (result) ? Iter++ : Iter = _files.end();
G> }
G> result = result && (Z_OK == zipClose(zipfile, NULL));
G> }
G> return result;
G>}
G>BOOL CPacker::Unpack(const char* _zipName, const char* _dstFolder)
G>{
G> BOOL result = FALSE;
G> unzFile zipFile = unzOpen(_zipName);
G> if (NULL != zipFile)
G> {
G> if (UNZ_OK == unzGoToFirstFile(zipFile))
G> {
G> BOOL bContinue = TRUE;
G> while (bContinue)
G> {
G> result = FALSE;
G> unz_file_info fi;
G> char filename[MAX_PATH] = {0};
G> if (UNZ_OK == unzGetCurrentFileInfo(zipFile, &fi,
G> filename, sizeof(filename), 0, 0, 0, 0))
G> {
G> if (UNZ_OK == unzOpenCurrentFile(zipFile))
G> {
G> UINT dataLen = fi.uncompressed_size;
G> BYTE* fileData = new BYTE[dataLen];
G> if (!fileData)
G> break;
G> if(dataLen == unzReadCurrentFile(zipFile, fileData, dataLen))
G> {
G> char filePathName[MAX_PATH] = {0};
G> strcat(filePathName, _dstFolder);
G> strcat(filePathName, "\\");
G> strcat(filePathName, filename);
G> FILE* pFile = fopen(filePathName, "wb");
G> if (pFile)
G> {
G> result = (dataLen == fwrite(fileData, 1, dataLen, pFile));
G> result = result && (0 == fclose(pFile));
G> }
G> }
G> delete [] fileData;
G> }
G> result = result && (UNZ_OK == unzCloseCurrentFile(zipFile));
G> }
G> if (!result)
G> break;
G> if (UNZ_END_OF_LIST_OF_FILE == unzGoToNextFile(zipFile))
G> bContinue = FALSE;
G> }
G> }
G> result = result && (UNZ_OK == unzClose(zipFile));
G> }
G> return result;
G>}
G>