我正在使用Ionic.Zip创建*.zip
。但是,我的*.zip
包含多次相同的文件,有时甚至是20次,而 ZIP 格式根本不会利用它。
更糟糕的是,Ionic.Zip有时会与OutOfMemoryException
崩溃,因为我正在将文件压缩为MemoryStream
。
是否有用于压缩的 .NET 库,它利用了文件之间的冗余?
用户可以自行解压缩文件,因此它不能是异国情调的格式。
答案 0 :(得分:2)
不,众所周知的API(例如GZip,PPMd,Zip,LZMA)没有暴露这样的API。它们都按文件操作(或更具体的字节流)。
您可以连接所有文件,即使用tar-ball格式,然后使用压缩算法。
或者,实现自己的检查是微不足道的:计算文件的哈希并将其存储在哈希文件名字典中。如果哈希匹配下一个文件,您可以决定要执行的操作,例如完全忽略此文件,或者记下其名称并将其保存在另一个文件中以标记重复项。
答案 1 :(得分:2)
是的,7-zip。您可以使用SevenZipSharp库,但根据我的经验,使用命令行直接启动压缩过程要快得多。
我的个人经历: 我们在公司中使用SevenZipSharp来解压缩高达1GB的档案,并且在我重新编写它之前它非常慢,因此它将通过运行其命令行界面直接使用7-zip库。然后它就像在Windows资源管理器中手动解压缩一样快。
答案 2 :(得分:2)
我最终使用SharpZipLib库创建了tar.gz。在1个文件上使用此解决方案,存档为3kB。在20个相同的文件上使用它,存档只有6kB,而在.zip中只有64kB。
的NuGet:
Install-Package SharpZipLib
Usings:
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;
代码:
var output = new MemoryStream();
using (var gzip = new GZipOutputStream(output))
using (var tar = TarArchive.CreateOutputTarArchive(gzip))
{
for (int i = 0; i < files.Count; i++)
{
var tarEntry = TarEntry.CreateEntryFromFile(file);
tar.WriteEntry(tarEntry,false);
}
tar.IsStreamOwner = false;
gzip.IsStreamOwner = false;
}
答案 3 :(得分:1)
我没有对此进行测试,但据How many times can a file be compressed?
中的一位回答者说如果您有大量重复文件,zip格式将分别独立压缩,然后您可以压缩第一个zip文件以删除重复的zip信息。