Re[3]: CSimpleZipArchive + folders support
От: daisywheel Украина www.daisywheel.kiev.ua
Дата: 27.02.07 12:38
Оценка:
Оказалось что предложенный код не умеет работать с папками в архиве. Мой посильный вклад:
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>


 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.