【问题标题】:Creating compressed file in C++ without knowing the initial file size在不知道初始文件大小的情况下在 C++ 中创建压缩文件
【发布时间】:2016-12-29 06:12:06
【问题描述】:

我一直在使用 Java 的标准库来编写 Zip Archive 文件,在这种情况下,我不必事先知道要存储到 zip 文件中的文件:我只需创建一个新的 ZipEntry,然后写入 ZipFile 流。

另一方面,用于 C++ 的 LibArchive 和 ZLib 必须事先设置要归档的文件信息:在我的情况下,我要压缩的数据来自外部流,因此我无法查询流本身。是否有使用这些库的库/方式,以便不需要初始文件信息?

编辑此外,以下带有 LibArchive 的 C++ 代码会生成一个有效的 ZIP 文件,其中包含一个没有数据的文件。

    a = archive_write_new();
    archive_write_add_filter_gzip(a);
    archive_write_set_format_pax_restricted(a); 
    archive_write_open_filename(a, path.c_str());
    entry = archive_entry_new(); // Note 2
    archive_entry_set_pathname(entry, entryName.c_str());
    archive_entry_set_perm(entry, 0666);
    archive_write_header(a, entry);
    size_t s = archive_write_data(a, buff, len);
    archive_entry_free(entry);
    archive_write_close(a);
    archive_write_free(a);

【问题讨论】:

  • 寻求建议的问题很快就会消失。请在 SO 上查阅help 的注意事项和注意事项部分。提到 JAVA 及其库对 c++ 相关问题没有意义。
  • 这是这个stackexchange社区的典型问题……
  • 并非如此。我们都经历过。当我还是初学者时也发生在我身上。一旦你学会了 SO 方式,就轻而易举了。
  • 实际上,我是在说我的预期操作是可能的。人们经常说“为什么,如果图书馆不做,那你就做不到”。所以说在Java中我可以做到,它有它的意义,说这是一个可能的事情。
  • 你错了,这里看“大小、文件类型和路径名都是必填属性。” github.com/libarchive/libarchive/wiki/Examples请在知道的情况下回复并提供反例。

标签: c++ gzip zlib libarchive


【解决方案1】:

在官方Zlib site上查看样本。在源文件中压缩到新文件的示例字节中,直到源上的 EOF。未使用源文件的文件大小。

您应该在示例中更改以使用自定义流的唯一内容是这一行:

strm.avail_in = fread(in, 1, CHUNK, source);

使用您的函数从流中获取字节以填充in 缓冲区。

要在 Zlib 中处理 ZIP 存档,请使用 contrib/minizipHere是关于如何使用的讨论。

【讨论】:

  • 谢谢。顺便说一句,通过这种方式,我每次只压缩一个文件,而不是 ZIP 存档。是否可以对 ZIP 档案做同样的事情?
  • @jackb Zlib 本身无法处理 ZIP 档案,但在 contrib\minizip 中有一个扩展。
  • 谢谢,我会试着检查一下。我编辑了我的问题,澄清我指的是 zip 档案。
  • @jackb 我已经更新了我的答案。检查有关 minizip 使用的链接 SO 讨论。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 2022-11-21
相关资源
最近更新 更多