.NET中的Delta压缩

时间:2012-05-04 14:56:35

标签: .net compression delta

是否有人能够在.NET环境中执行压缩以生成文件之间的增量。我想尽可能使用这个功能,也许是通过使用msdelta.dll中的功能。我也对如何使用其他库(最好是开源)生成增量感兴趣。

2 个答案:

答案 0 :(得分:8)

我希望这不是一个无耻的插件,但为了我自己的目的,我已经围绕 PatchAPI MSDelta 编写了一个包装库。

该库在MS-PL和DBAD-PL下是双重许可的,可在GitHub上获得。

我很喜欢在NuGet上发布项目的概念,但目前你可以下载源代码并创建和应用增量。

创建delta应该是不言自明的:

var compression = new MsDeltaCompression(); /* or PatchApiCompression(); */
compression.CreateDelta(sourcePath, destinationPath, deltaPath);

同样不言自明(希望如此)正在应用delta:

var compression = new MsDeltaCompression(); /* or PatchApiCompression(); */
compression.ApplyDelta(deltaPath, sourcePath, destinationPath);

在x86上测试过,但P / Invoke签名对x64和ia64同样有效。

如果您还没有决定是否使用 PatchAPI MSDelta ,我的项目README.md会尝试(简要地)建议哪一个您应该使用,但除此之外the documentation for Microsoft's Delta Compression有关于 MSDelta PatchAPI 的说法:

  

MSDelta ...可以创建比其他方法生成的压缩文件小得多的压缩文件。使用Windows Vista发布,它是以前作为PatchAPI发布的下一代技术(将继续得到支持)。

强调我的。

答案 1 :(得分:3)

Fossil SCM有一个用C实现的增量压缩算法,我在C#上创建了一个端口:https://github.com/endel/FossilDelta

要创建增量,您必须提供原点和目标的byte[]。它以byte[]的形式返回,您可以稍后申请。

byte[] origin = System.IO.File.ReadAllBytes ("old-file");
byte[] target = System.IO.File.ReadAllBytes ("new-file");
byte[] delta = Fossil.Delta.Create(origin, target);

拥有delta,您可以在原始文件中应用更改,如下所示:

byte[] applied = Fossil.Delta.Apply(origin, delta);

我认为值得一提的是,这个算法的作者是SQLite的同一作者 - 所以它有一定的可信度。