有没有人能够在 .NET 环境中执行压缩以在文件之间生成增量。如果可能的话,我想使用这个功能,也许是通过使用 msdelta.dll 中的功能。我也对如何使用其他库(最好是开源的)生成增量感兴趣。
2 回答
我希望这不是一个太无耻的插件,但是出于我自己的目的,我已经围绕PatchAPI和MSDelta编写了一个包装库。
该库在 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 的文档中有关于MSDelta与PatchAPI的说明:
MSDelta ... 可以创建比其他方法生成的压缩文件小得多的压缩文件。它与 Windows Vista 一起提供,是先前作为 PatchAPI 发布的下一代技术(将继续得到支持)。
强调我的。
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 的作者相同——因此具有一定的可信度。