Как мне использовать Minizip (на Zlib)?
Я пытаюсь архивировать файлы для кроссплатформенного приложения, и похоже, что Minizip (построенный на zlib) примерно такой же портативный, как и архиваторы.
Когда я пытаюсь запустить следующий фиктивный код, я получаю системную ошибку [my executable] has stopped working. Windows can check online for a solution to the problem.
Может кто-нибудь помочь мне увидеть, как использовать эту библиотеку? - (нигде нет документации или учебника)
zip_fileinfo zfi;
int main()
{
zipFile zf = zipOpen("myarch.zip",APPEND_STATUS_ADDINZIP);
int ret = zipOpenNewFileInZip(zf,
"myfile.txt",
&zfi,
NULL, 0,
NULL, 0,
"my comment for this interior file",
Z_DEFLATED,
Z_NO_COMPRESSION
);
zipCloseFileInZip(zf);
zipClose(zf, "my comment for exterior file");
return 0;
}
Спецификации: Msys + MinGW, Windows 7, используя zlibwapi.dll из zlib125dll.zip/dll32
3 ответа
Так как я нашел этот вопрос через Google, и он не содержал никакого полного, рабочего кода, я предоставляю здесь некоторые для будущих посетителей.
int CreateZipFile (std::vector<wstring> paths)
{
zipFile zf = zipOpen(std::string(destinationPath.begin(), destinationPath.end()).c_str(), APPEND_STATUS_CREATE);
if (zf == NULL)
return 1;
bool _return = true;
for (size_t i = 0; i < paths.size(); i++)
{
std::fstream file(paths[i].c_str(), std::ios::binary | std::ios::in);
if (file.is_open())
{
file.seekg(0, std::ios::end);
long size = file.tellg();
file.seekg(0, std::ios::beg);
std::vector<char> buffer(size);
if (size == 0 || file.read(&buffer[0], size))
{
zip_fileinfo zfi = { 0 };
std::wstring fileName = paths[i].substr(paths[i].rfind('\\')+1);
if (S_OK == zipOpenNewFileInZip(zf, std::string(fileName.begin(), fileName.end()).c_str(), &zfi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION))
{
if (zipWriteInFileInZip(zf, size == 0 ? "" : &buffer[0], size))
_return = false;
if (zipCloseFileInZip(zf))
_return = false;
file.close();
continue;
}
}
file.close();
}
_return = false;
}
if (zipClose(zf, NULL))
return 3;
if (!_return)
return 4;
return S_OK;
}
Библиотека Minizip поставляется с примерами; minizip.c для архивирования и miniunz.c для разархивирования. Обе утилиты командной строки, которые показывают, как использовать библиотеку. Они беспорядок, хотя.
Вам также необходимо заполнить ZFI zip_fileinfo
, По крайней мере, вы должны инициализировать структуру до нуля. zfi содержит информацию о файле, который вы хотите сохранить с помощью zipOpenNewFileInZip
, Структура должна содержать дату и атрибуты "myfile.txt".
Я рекомендую использовать PKWARE Desktop для диагностики проблем с zip. Он показывает структуру / свойства файлов в ZIP-файле и сам ZIP-файл. Когда я открыл myarch.zip, он сказал мне, что были ошибки. Я углубился в свойства файла и обнаружил, что атрибуты отключены.
Мини-библиотека хорошо документирована. Просто откройте zip.h для деталей.
Я могу сказать вам здесь, вы, возможно, передали неправильный параметр для zipOpen. (APPEND_STATUS_ADDINZIP требуется существующий zip-файл!)
Также, пожалуйста, проверьте, возвращает ли zipOpen действительный дескриптор zipFile.