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

对不起,如果这很明显。

4

3 回答 3

7

查看minizip.c以了解如何使用 minizip 创建 zip 文件的示例。minizip 在 zlib 发行版的 contrib 目录下,这意味着它是第三方贡献的代码。它不是 zlib 库的一部分。

请注意, gzip不是 zip。zlib 格式不是 zip。原始 deflate 数据不是 zip。这些都是不同的格式。原始 deflate 数据是 zip 格式中允许的压缩格式之一实际上是最常见的。zlib 对于处理 zip 文件很有用,但它本身并不这样做。zlib 本身仅提供压缩和解压缩引擎以及 CRC 计算。

于 2013-09-11T07:22:31.490 回答
4

不要混合使用 zip - 归档标准,其中可以包含多个文件,以及 zlib - 在 zip 中用于压缩单个文件/数据流。要压缩目录,您应该使用 minizip/infozip 或任何其他与 ZIP 存档格式兼容的库。

于 2013-09-10T22:02:43.040 回答
3

我误解了一点ZIP和压缩。

最后我决定按照wikipedia,this page实现 ZIP 存档格式。我在 windows 和 7z 上广泛使用了 HxD 工具进行了很多测试。

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

因此,如果将来有人遇到问题,请查看 wikipedia 上的 zip 格式并将 zlib 用于 crc32,然后如果您想使用 zlib 压缩您的块。

感谢大家

于 2013-09-12T20:14:11.587 回答