使用zlib压缩目录

8
我有一个C++应用程序,需要使用标准压缩格式来压缩目录。我考虑使用zip格式。因此,zlib是显而易见的选择。
我的问题在于构建字典,即使用zlib将包含一些文件的目录压缩成标准的zip文件。我已经了解到zlib可以实现这个功能,但我不知道如何操作。我查看了minzip代码,它似乎使用gzip。我可以构建自己的格式,但我希望能够使用7z打开这些文件进行调试(以防万一)。
在zlib中应该使用什么来压缩目录?
编辑:在minzip中,我使用minzip将1个文件压缩为其gz版本,而不是zip,但对我来说没问题。(我将在世界各地的各种编译器上使用它--在客户端平台出现问题时,使用标准格式更容易)
此外,在main函数中有以下代码。它循环遍历文件列表并将其写入输出。但是存档中的文件位置信息在哪里?
    do {
        if (uncompr) {
            if (copyout) {
                file = gzopen(*argv, "rb");
                if (file == NULL)
                    fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv);
                else
                    gz_uncompress(file, stdout);
            } else {
                file_uncompress(*argv);
            }
        } else {
            if (copyout) {
                FILE * in = fopen(*argv, "rb");

                if (in == NULL) {
                    perror(*argv);
                } else {
                    file = gzdopen(fileno(stdout), outmode);
                    if (file == NULL) error("can't gzdopen stdout");

                    gz_compress(in, file);
                }

            } else {
                file_compress(*argv, outmode);
            }
        }
    } while (argv++, --argc);

如果这很显然,我很抱歉。


1
运行zip来完成这项工作不是更简单、更健壮的方法吗?有什么好的理由吗? - Jonathan Leffler
在 zlib 的 contrib 文件夹中有一个 minizip - Oleg Pyzhcov
是的,我看到了这个,但我不知道如何将一个文件夹传递给它。也许可以传递一个文件列表,但是如何构建字典呢? - dzada
3个回答

8
请查看 minizip.c,了解如何使用minizip创建zip文件。minizip在zlib发行版的contrib目录中,这意味着它是第三方贡献的代码,不是zlib库的一部分。
请注意gzip不等同于zip,zlib格式不等同于zip,原始deflate数据也不等同于zip,这些都是不同的格式。原始deflate数据是zip格式中允许的压缩格式之一,实际上是最常见的一种。zlib适用于处理zip文件,但它不能单独完成这项任务。zlib本身只提供压缩和解压引擎以及CRC计算功能。

谢谢,我今天(快速地)阅读了zip格式标准,我明白了,zip是一种归档格式。实际上,我更需要的是归档格式而不是压缩。我想要zip,因为它在所有操作系统中都内置了。我正在尝试看看是否更容易自己编写zip格式打包,并使用zlib进行压缩。最好的。 - dzada

4

不要混淆压缩文件归档的标准zip和用于压缩单个文件/数据流的zlib。要压缩一个目录,你应该使用minizip/infozip或任何其他与ZIP文件格式兼容的库。


1
既然我已经尝试了minzip,它是如何处理的呢?我成功地将1个文件压缩成了“.gz”文件,并可以使用7z打开。但我不理解.gz文件中文件信息的位置。 - dzada
没有。gzip只是压缩原始数据 - 它不是一个存档格式;它没有任何文件的概念。 - user149341
好的,有没有我可以用来构建这个字典的库? - dzada
我找到了libzip,但是我不确定它是否可靠,并且在我的操作系统(Mac和Win)上未经修复就无法构建。 - dzada

3

我对ZIP和压缩有些误解。

最终,我决定按照维基百科上的说明此页面实现ZIP归档格式,并广泛使用Windows上的HxD工具和7z进行测试。

最终我发现,归档格式很简单,我只支持1个磁盘,N个带有目录的文件,并基于zlib进行压缩。 我还使用zlib进行crc32校验。

因此,如果将来有人遇到问题,请参考维基百科上的zip格式,并使用zlib进行crc32校验,然后如果您想使用zlib压缩块。

感谢大家


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接