我如何使用Minizip(在Zlib上)?

我正在尝试为跨平台应用程序存档文件,看起来像Minizip(基于zlib构建)就像归档程序一样可移植。

但是,当我尝试运行以下虚拟代码时,我收到系统错误[my executable] has stopped working. Windows can check online for a solution to the problem. [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,使用zlib125dll.zip/dll32中的zlibwapi.dll

由于我通过谷歌发现了这个问题并且它没有包含任何完整的,有效的代码,我在这里为未来的访问者提供了一些。

 int CreateZipFile (std::vector 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 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时,它告诉我有错误。 我钻进了文件属性,发现属性已关闭。

minizip lib有很好的文档记录。 只需打开zip.h即可获取详细信息。

我可以告诉你,你可能已经为zipOpen传递了一个错误的参数。 (APPEND_STATUS_ADDINZIP需要现有的zip文件!)

另外,请检查zipOpen是否返回有效的zipFile句柄。