如何将目录压缩成单个文件?

6
我需要存储一些压缩文件。最初的想法是创建一个文件夹并存储尽可能多的压缩文件,同时创建一个文件来保存有关每个压缩文件的数据。
然而,我不能创建太多的文件,只能有一个文件。我决定创建一个带有进一步数据头的压缩文件,并在头部后保留压缩数据。但是这种选项有缺点,例如,在创建文件后编辑它需要很长时间,即使我只想添加一个小文件,也必须完全重写。
因此,我认为,我需要创建具有特定属性的文件夹并在其中创建尽可能多的文件。这是否可能?
我正在为Windows创建一个应用程序,所以我可以使用任何适用于Windows的工具,并使用C++进行编码。
注意:只需要一个文件,例如,它将通过电子邮件发送,附加许多文件不是理想的解决方案。
注意:我不需要压缩算法,我需要一种有效地将所有内容存储在单个文件中的方法。

1
你可能可以使用结构化存储来实现这个功能(但是不能使用常规文件函数)。 - Medinoc
由于这是Windows系统,您可以使用备用数据流 - MSalters
出于好奇,你为什么需要创建比允许的文件更多的文件呢?而且一开始限制一个文件的限制又来自哪里呢?在创建复杂的解决方案之前(长期维护将更加困难),你是否已验证 (a) 不能以不同方式设计程序或者 (b) 是否无法说服客户允许你创建常规目录(毕竟这可能对他们有利)? - stakx - no longer contributing
@stakx 正常目录不被允许,但我已经为一个单一的二进制文件创建了结构,但它不够快。 - ST3
@user2623967:我已经理解了;我的问题是:为什么不允许这样做,而且你为什么非要这样做呢?(有时候质疑现状并与人交谈/说服他们接受一种不同的做事方式可能会带来回报,从长远来看可能更好。) - stakx - no longer contributing
显示剩余3条评论
3个回答

1
你可以创建一个SQLite数据库,或者一个SQL Server Compact Edition数据库(它驻留在单个.sdf文件中),并将所有数据存储为BLOB。数据库管理系统应该足够容易与应用程序的其他二进制文件一起部署。
就SQL Server Compact而言,我不确定从非托管代码(C ++)中使用它有多容易。在.NET中很容易,但我相信C ++也可以做到,需要进行一些研究。
至少,this Stack Overflow question介绍了如何通过OLE DB提供程序从C ++连接到这样的数据库。

C++中使用SQLite没有问题,但我不确定老板是否想向项目中添加更多的内容, 因为他是老板,有时候做出了好决定,有时候则不太好,如果你懂我的意思 :) - ST3
@user2623967:是的,我有。;-) 有时候把你的问题转化为项目成本会有所帮助:重新发明轮子可以避免对第三方库的依赖,但通常更昂贵(需要更多的开发时间)。并且在维护期间可能会花费更多,因为你自己的解决方案可能会有漏洞。另一方面,SQLite是一个更成熟的产品,可以预期它能够很好地工作。 - stakx - no longer contributing
你的答案可能是最好的,但是SQLite不提供压缩比率,并且压缩和解压时间并不重要,所以我仍然使用单个文件。 - ST3

0

0
作为另一种选择,您可以使用tar文件:一个包含自定义头信息的文件条目,用于其他条目(压缩等),以及所有文件作为tar文件中的条目。我不知道如何使用库函数替换条目(在这里我获得了信息,至少在Linux上使用gnu tar http://www.karkomaonline.com/index.php/2005/03/basic-tar-usage-gnu-tar/命令行实用程序是可能的),但似乎可以在不重新创建整个存档的情况下进行替换。 我认为您首先必须创建更大的虚拟条目,以便稍后有足够的可用空间,以便这些条目可以被所有所需数据替换。

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