9

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

4

2 回答 2

8

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

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

我正在考虑在 NuGet 上发布项目的想法,但目前您可以下载源代码并创建和应用增量。

创建增量应该是不言自明的:

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

同样不言自明(希望)正在应用一个增量:

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

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

如果您还没有决定是使用PatchAPI还是MSDelta,我的项目会README.md尝试(简要地)建议您应该使用哪一个,但微软的 Delta Compression 的文档中有关于MSDeltaPatchAPI的说明:

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

强调我的。

于 2013-02-10T07:13:55.757 回答
5

Fossil SCM 有一个用 C 实现的 delta 压缩算法,我在 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);

有了增量,您可以像这样应用原始文件中的更改:

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

我认为值得一提的是,该算法的作者与 SQLite 的作者相同——因此具有一定的可信度。

于 2016-10-03T20:37:33.863 回答