如何使用C++压缩文件夹中的文件?

9
我正在使用C++、Boost和Qt开展一个项目。我知道如何使用Qt中的qCompress()函数压缩单个文件和字节流。
那么如何压缩包含子目录在内的多个文件的目录呢?我需要跨平台(Mac、Win、Linux)解决方案,最好不要启动一堆新进程。
是否有一种标准方法将多个文件的字节流组合成一个压缩存档,或者Boost iostream库中可能有一个方便的函数或方法可用?
非常感谢您的帮助。
更新:QuaZip库看起来真的很棒。下载包中有一个示例(在“tests”目录中),非常清楚地显示了如何压缩文件目录。
更新2:在我完成这个任务的Linux构建环境后,我发现QuaZip与Visual Studio编译器根本不兼容。也许可以解决所有这些编译器错误,但是对于任何想要走这条路的人,提醒一句。

是的,我正在寻找.zip文件。从zlib.net网站链接的minizip库可能能够帮助,但我需要更深入地了解一下它...如果有人对这个库知道得更多,我会很感激听到他们的意见。 - martian
你能用zlib压缩整个目录吗?还是只能压缩单个文件? - Frank
Zlib只能处理单个文件 - 您需要另一个包格式来处理文件和目录。 - Martin Beckett
你可以使用minizip(可以在zlib/contrib/minizip中找到)压缩整个目录,但是你需要遍历目录的内容并逐个添加文件(可以使用boost::filesystem来帮助实现)。 - tonymontana
@AdamPierce 不是的!压缩数据流几乎总是deflate数据流,实际上可以通过zlib生成和解码。 - John
显示剩余2条评论
6个回答

9
我发现了以下两个库:
  • ZipIOS++。看起来是“纯”C ++。他们没有明确列出Windows作为支持的平台。因此,我认为你应该自己尝试一下。
  • QuaZIP。基于Qt4。实际上很不错。他们明确列出Windows(使用mingw)。显然,它是这个[库]的C ++包装器。

啊,当然,我从这个 Qt邮件列表问题中撕下了那些网站,关于目录的压缩/解压缩 :)


QuaZip看起来是一个不错的选择。谢谢! - martian
ZipIOS++确实有MSVC 6项目文件。然而,它从Boost.Filesystem(截至2001年!)借用了一些代码,这些代码在我的VS2008环境中并不能直接编译通过。所以我想我还得看看QuaZIP或者纯zlib... - Reunanen

1

Poco::Zip也是一个选择,它有清晰的文档和一些演示代码。

Poco::Zip文档


1
我已经在minizip周围构建了一个包装器,添加了一些我需要的功能,并使其更易于使用。它使用最新的c++11并使用Visual Studio 2013开发,因此您应该可以直接使用它。您可以压缩整个文件夹、流、向量等。另外一个不错的功能是完全在内存中完成所有操作。这里有一个完整的描述: https://github.com/sebastiandev/zipper

1

仅供记录...

今天,我需要在Visual C++中做一些非常相似的事情。(虽然希望能够在其他平台上编译项目;但是出于这个目的,我更倾向于不采用Qt。)

最终使用了Minizip库。它是用纯C编写的,但是围绕它设计一个简单的C++包装器非常容易,而且最终结果对我的目的来说非常好。


0
system("zip myarchive.zip *");

1
他说他不想启动新的进程。 - PolyThinker
1
这只是一个额外的进程,比使用第三方库实现起来要快得多。但是,我不知道不想启动另一个进程的原因,也许OP的内存非常有限或者希望在ZIP运行时拥有更多的控制权,但这就是我会做的方式。 - Adam Pierce
2
这不是生成新进程的问题。这个答案太无知了。如果没有安装“zip”,那么其他平台又怎么办,比如Unix? - Jacek Ławrynowicz

0

我在Windows上使用VisualStudio 2010尝试了QuaZIP 0.4.3 - 还存在一些问题,但可以轻松解决。

使用VS构建:

  1. 使用CMake为QuaZIP配置和生成VS解决方案。
  2. 使用VS打开解决方案并构建--您会注意到它找不到“zlib.h”。
  3. 打开quazip项目的首选项,并将Qt的Zlib副本路径添加到C/C++->常规->附加包含目录中:$(QTDIR)/src/3rdparty/zlib。
  4. 重新构建,您将得到许多警告和一个错误C2491:QuaZipFile::staticMetaObject上的dllimport静态问题。
  5. 这是因为QuaZipFile被声明为“class QUAZIP_EXPORT QuaZipFile”,QUAZIP_EXPORT需要解析为Q_DECL_EXPORT用于dll和Q_DECL_IMPORT用于应用程序,具体取决于QUAZIP_BUILD是否定义。在构建QuaZIP时,QUAZIP_BUILD应该被定义,但实际上没有--配置过程定义了一个完全无用的“quazip_EXPORTS”。
  6. 要修复此问题,只需从所有构建配置中删除“quazip_EXPORTS”,并添加QUAZIP_BUILD--QuaZIP现在将构建成功。

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