C++文件容器(例如zip)以便于访问

5
我有很多小文件需要随应用程序一起分发,我想将这些文件打包成一个归档文件以方便复制和分发。我也非常喜欢把它们都放在一个地方,以便在出现问题时只需要比较一个文件的md5值。
我正在考虑编写一个类,该类可以加载归档文件并返回归档文件中的文件列表,并在需要访问文件时将文件加载到内存中。
我已经在互联网上搜索了不同的方法来实现我的目标,并了解到了zlib和lzma sdk。但两者都不太适合我,因为我不知道zlib有多可移植,而且我不喜欢lzma sdk,因为它太大了,我不想因为这个问题而使应用程序变得臃肿。另外,使用zlib的缺点是我没有足够的C/C++经验(我真的很新手),无法理解手册中的所有内容。
我还必须补充一点,这是一个时间紧迫的问题。我曾经考虑过以一种能够轻松访问我的应用程序中的文件的方式实现类似tar的简单格式,但我还没有找到时间去做。
所以我正在寻找一个库,可以让我访问归档文件中的文件。如果有人能指导我正确的方向,我将不胜感激。
谢谢您的帮助, Robin。
编辑:我需要在Linux和Windows下访问归档文件。抱歉我一开始没有提到这点。
6个回答

3

对于压缩文件,我一直倾向于使用ZipUtils,它会使整个压缩过程变得简单,并且是在zlib和info-zip库的基础上构建的。


谢谢你提供的链接,但我需要它能在Windows和Linux上运行。ZipUtils只能在Windows上运行。 - Robin
@Robin:你能把那个放到你的问题里吗?谢谢! - Billy ONeal

2
答案取决于您是否计划在构建归档文件后通过代码修改归档文件。
如果您不需要修改它,可以使用 TAR 格式 - 这是一种方便且简单的格式。如果您想要压缩,可以实现 tar.gz 读取器或找到一些可以执行此操作的库(我相信有一些可用,包括开源的)。
如果您的应用程序需要随机访问数据或需要修改归档文件,则常规的 TAR 或 ZIP 归档文件不适用。虚拟文件系统如我们的 SolFS 或 CodeBase 文件系统将更加适合:虚拟文件系统适用于频繁修改存储的情况,而归档文件主要针对一次写入、多次读取的使用场景。

2
好像压缩文件(Zip)就够了,但我并没有深入研究VFS这个术语。我发现了PhysicsFS,我想那正是我将在我的项目中使用的。非常感谢您的回答。 - Robin

1

zlib 是高度可移植且广泛使用的。如果您无法理解 C++ 接口,则许多其他语言都有替代方案 - 请参见“相关外部链接”此处

在寻找其他内容之前,请再仔细查看一遍。


2
但是 zlib 所做的并不是 OP 想要的存档。它进行压缩,但是它本身无法理解 .zip 文件格式。 - Billy ONeal
是的,压缩只是其次,我主要需要的是将数百个小文件分组成一个单独的文件。 - Robin

1
如果您正在使用Qt或Windows,您还可以将数据打包到可执行文件的资源区域中。您只需要使用这种技术分发可执行文件即可。已经编写和测试了一个明确定义的API来访问该数据。

0

使用zlib API是一个好的选择。它简单易用且具有可移植性。查看unzip.h头文件以获取访问归档文件的API。它使用C语言编写,非常容易上手。

如果文件很小,您可以将它们转储为字符串文字(搜索bin2h实用程序)并包含在项目中。然后更改读取文件的代码。如果所有文件都是使用ifstream类读取的,则只需将其更改为istringstream类并重新编译代码即可。


0

尝试使用 Quazip - 它非常简单易用。您可以将其用作流,从中动态读取压缩文件。


谢谢您的建议,但我不想在控制台应用程序中添加Qt依赖项。 - Robin

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