16

我正在尝试为跨平台应用程序归档文件,看起来 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

4

3 回答 3

22

由于我通过 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;
}
于 2014-09-09T11:47:45.543 回答
4

minizip 库确实带有示例;minizip.c用于压缩和miniunz.c用于解压缩。两者都是显示如何使用库的命令行实用程序。他们虽然是一团糟。

您还需要填写 zfi zip_fileinfo。至少您应该将结构初始化为零。zfi 包含有关您要使用存储的文件的信息zipOpenNewFileInZip。该结构应包含“myfile.txt”的日期和属性。

我建议使用 PKWARE Desktop 来诊断 zip 问题。它显示了 ZIP 中文件的结构/属性和 ZIP 文件本身。当我打开 myarch.zip 时,它告诉我有错误。我深入研究了文件属性,发现属性已关闭。

于 2012-07-09T10:18:06.813 回答
2

minizip 库有据可查。只需打开 zip.h 即可了解详细信息。

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

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

于 2012-07-07T02:55:07.917 回答