3

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

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

是否有一个.NET库来利用文件之间的冗余进行压缩?

用户自行解压缩文件,因此它不能是外来格式。

4

4 回答 4

4

我最终使用 SharpZipLib 库创建了一个 tar.gz。在 1 个文件上使用此解决方案,存档为 3kB。在 20 个相同的文件上使用它,存档只有 6kB,而在 .zip 中它是 64kB。

努盖特:

Install-Package SharpZipLib

用途:

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;
            }
于 2013-08-29T09:38:36.807 回答
2

不,众所周知的 API(例如 GZip、PPMd、Zip、LZMA)没有公开这样的 API。它们都按文件操作(或者更具体的字节流)。

您可以连接所有文件,即使用 tar-ball 格式,然后使用压缩算法。

或者,实现自己的检查很简单:计算文件的哈希并将其存储在哈希文件名字典中。如果下一个文件的哈希匹配,您可以决定要做什么,例如完全忽略此文件,或者可能记下其名称并将其保存在另一个文件中以标记重复项。

于 2013-08-28T15:11:27.027 回答
2

是的,7-zip。您可以使用 SevenZipSharp 库,但根据我的经验,直接使用命令行启动压缩过程要快得多。

我的个人经验:我们在一家公司使用 SevenZipSharp 解压缩高达 1GB 的档案,它非常慢,直到我对其进行了重新设计,以便它可以通过运行其命令行界面直接使用 7-zip 库。然后它和在 Windows 资源管理器中手动解压缩时一样快。

于 2013-08-28T15:13:04.670 回答
1

我没有对此进行测试,但是根据一个文件可以压缩多少次?

如果您有大量重复文件,则 zip 格式将分别单独压缩,然后您可以压缩第一个 zip 文件以删除重复的 zip 信息。

于 2013-08-28T15:15:13.880 回答