有效压缩多次复制相同文件的文件夹

时间:2013-08-28 14:59:09

标签: c# compression zip

我正在使用Ionic.Zip创建*.zip。但是,我的*.zip包含多次相同的文件,有时甚至是20次,而 ZIP 格式根本不会利用它。

更糟糕的是,Ionic.Zip有时会与OutOfMemoryException崩溃,因为我正在将文件压缩为MemoryStream

是否有用于压缩的 .NET 库,它利用了文件之间的冗余?

用户可以自行解压缩文件,因此它不能是异国情调的格式。

4 个答案:

答案 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信息。