如何使用Minizip(上Zlib压缩)?(How do I use Minizip (on Zli

2019-06-26 03:02发布

我试图存档文件的跨平台应用程序,它看起来像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中,使用zlibwapi.dll从zlib125dll.zip/dll32

Answer 1:

因为我发现,通过谷歌这个问题,并没有包含任何完整的,工作代码,我在这里为今后的游客提供了一些。

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;
}


Answer 2:

该minizip库不来举例; minizip.c用于压缩和miniunz.c为解压。 两者都是命令行实用程序,展示了如何使用图书馆。 他们是一个烂摊子,但。

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

我建议使用PKWARE桌面诊断拉链的问题。 它显示了ZIP和ZIP文件本身的文件的结构/性能。 当我打开myarch.zip它告诉我,有错误。 我钻下来到该文件的属性,发现该属性被关闭。



Answer 3:

该minizip LIB是有据可查的。 只要打开有关详细信息,zip.h。

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

另外,请检查是否zipOpen返回一个有效的zip文件句柄。



文章来源: How do I use Minizip (on Zlib)?
标签: c zip zlib