【问题标题】:Using zlib to compress a directory使用 zlib 压缩目录
【发布时间】:2013-09-10 17:35:24
【问题描述】:

我有一个需要对目录使用标准压缩格式的 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);

对不起,如果这很明显。

【问题讨论】:

  • 运行zip 来完成这项工作不是更简单、更健壮吗?
  • 在zlib contrib 文件夹中有minizip 一个。
  • 是的,我看过这个,但我也看不到如何将文件夹传递给它。也许是文件列表。那么如何构建字典呢?

标签: c++ zip zlib


【解决方案1】:

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

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

【讨论】:

  • 谢谢我今天(快速)阅读了 zip 格式标准,我明白了,zip 是存档格式。事实上,我确实需要更多的存档格式而不是压缩。我想要 zip,因为它内置在所有操作系统中。我正在尝试自己编写zip格式的包装是否更容易,并使用zlib进行压缩。最佳
【解决方案2】:

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

【讨论】:

  • 所以我已经尝试过使用 minzip 它是如何管理这个的?我已经成功地将 1 个文件压缩成一个“.gz”文件,我可以用 7z 打开它。但是我不明白.gz文件中文件信息的信息在哪里。
  • 没有。 gzip 只是压缩原始数据——它不是存档格式;它没有任何文件的概念。
  • 好的,有没有我可以用来构建这个字典的库?
  • 我找到了 libzip,但我不知道这是否可靠,并且如果没有在我的操作系统(Mac 和 Win)上进行修复,它就无法构建
【解决方案3】:

我对 ZIP 和压缩有点误解。

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

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

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

谢谢大家

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多