【问题标题】:Delta Compression in .NET.NET 中的增量压缩
【发布时间】:2012-05-04 14:56:35
【问题描述】:

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

【问题讨论】:

  • xdelta 是我见过使用最多的开源软件。不过,不确定从 C# 调用是否容易。
  • 谢谢。我检查了你的链接,发现另一个链接 (pobox.com/~skeet/csharp/miscutil) 确实有 c# 解码器版本。不过,我还需要一个编码器。

标签: .net compression delta


【解决方案1】:

我希望这不是一个太无耻的插件,但我已经为自己的目的编写了一个围绕 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 会尝试(简要地)建议您应该使用哪一个使用,但除此之外the documentation for Microsoft's Delta CompressionMSDeltaPatchAPI 有这样的说法:

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

强调我的。

【讨论】:

  • 伟大的图书馆 ta.speot.is。我很好奇你是否有可能扩展它来制作签名文件,这样如果我在网络上工作,我就不必通过网络传输整个文件来获取增量,而只需传输三角洲。
  • @Jeremy 谢谢。您是否在询问某种 delta 补丁服务器,您向它发送文件当前版本的哈希值,然后它会向您发送一个补丁以使其与最新版本保持同步?
  • 是的,这是正确的。我知道 MS 有 Remote Differential Compression (RDC),但 MSDelta 似乎更易于使用。我听说 RDC 还依赖它的 RDC 服务来运行才能使用它,我不想依赖它。
  • @Jeremy 这个库的目的是提供类似的东西的一部分。尽管我从未继续将服务器作为其中的一部分,但我认为这并不比将这个库与<your favourite web service framework here> 结合使用更难。如果您正在寻找类似于 RDC 的功能,我必须承认我以前从未见过 RDC,也从未打算用它来补充或取代它。
  • 你好。我是 .Net 的新手。你能解释一下我在哪里可以找到 msdelta.dll 或 mspatcha.dll。我想在我的应用程序中使用这些 dll。但是找不到。我安装了 Microsoft SDK 7.1,但只有 mspatchc.dll 而不是 mspatcha.dll。并且有 msdelta.lib 而不是 dll。
【解决方案2】:

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);

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

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

我觉得值得一提的是,这个算法的作者和SQLite的作者是同一人——所以有一定的可信度。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-25
    相关资源
    最近更新 更多