我正在尝试为跨平台应用程序归档文件,看起来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,使用zlib125dll.zip/dll32中的zlibwapi.dll
答案 0 :(得分:17)
由于我通过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;
}
答案 1 :(得分:3)
minizip库确实附带了示例;用于压缩的 minizip.c 和用于解压缩的 miniunz.c 。两者都是命令行实用程序,显示如何使用库。他们虽然很乱。
您还需要填写zfi zip_fileinfo
。至少你应该将结构初始化为零。 zfi包含有关您要使用zipOpenNewFileInZip
存储的文件的信息。该结构应包含“myfile.txt”的日期和属性。
我建议使用PKWARE Desktop来诊断zip问题。它显示了ZIP和ZIP文件本身中文件的结构/属性。当我打开myarch.zip时,它告诉我有错误。我深入到文件属性中,发现属性已关闭。
答案 2 :(得分:2)
minizip lib有很好的文档记录。只需打开zip.h即可获得详细信息。
我可以告诉你,你可能已经为zipOpen传递了一个错误的参数。 (APPEND_STATUS_ADDINZIP需要现有的zip文件!)
另外,请检查zipOpen是否返回有效的zipFile句柄。