我正在*.zip
使用 Ionic.Zip 创建一个。但是,我*.zip
多次包含相同的文件,有时甚至 20 倍,而且ZIP格式根本没有利用它。
更糟糕的是,Ionic.Zip 有时会崩溃OutOfMemoryException
,因为我将文件压缩成MemoryStream
.
是否有一个.NET库来利用文件之间的冗余进行压缩?
用户自行解压缩文件,因此它不能是外来格式。
我正在*.zip
使用 Ionic.Zip 创建一个。但是,我*.zip
多次包含相同的文件,有时甚至 20 倍,而且ZIP格式根本没有利用它。
更糟糕的是,Ionic.Zip 有时会崩溃OutOfMemoryException
,因为我将文件压缩成MemoryStream
.
是否有一个.NET库来利用文件之间的冗余进行压缩?
用户自行解压缩文件,因此它不能是外来格式。
我最终使用 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;
}
不,众所周知的 API(例如 GZip、PPMd、Zip、LZMA)没有公开这样的 API。它们都按文件操作(或者更具体的字节流)。
您可以连接所有文件,即使用 tar-ball 格式,然后使用压缩算法。
或者,实现自己的检查很简单:计算文件的哈希并将其存储在哈希文件名字典中。如果下一个文件的哈希匹配,您可以决定要做什么,例如完全忽略此文件,或者可能记下其名称并将其保存在另一个文件中以标记重复项。
是的,7-zip。您可以使用 SevenZipSharp 库,但根据我的经验,直接使用命令行启动压缩过程要快得多。
我的个人经验:我们在一家公司使用 SevenZipSharp 解压缩高达 1GB 的档案,它非常慢,直到我对其进行了重新设计,以便它可以通过运行其命令行界面直接使用 7-zip 库。然后它和在 Windows 资源管理器中手动解压缩时一样快。
我没有对此进行测试,但是根据一个文件可以压缩多少次?
如果您有大量重复文件,则 zip 格式将分别单独压缩,然后您可以压缩第一个 zip 文件以删除重复的 zip 信息。