1

(好吧,不要对我大喊大叫,这里已经很晚了:))

我正在研究 delta diff 工具(命令行工具或组件,只要我可以从Delphi 2010调用它们就可以了)

我有这个项目,我将文件上传到服务器,我需要优化上传,所以如果我只能上传 delta 文件而不是发送新文件,然后比较服务器上的新旧文件版本,那就太好了。

我在这里读到了 Duplicity

Duplicity 是 rdiff-backup 的一种变体,它允许在没有存储服务器合作的情况下进行备份,就像 Amazon S3 等简单的存储服务一样。它的工作原理是提前为每个块生成哈希,加密它们,并将它们存储在服务器上,然后在进行增量备份时检索它们。出于安全目的,其余数据也被加密存储。

这让我想到,是否有一种工具(或方法)可以基于新文件生成补丁或增量文件(我不确定正确的术语是什么) ,无需访问原始文件?

我的意思是,假设我有这个文件,我修改过一次:

my-data.db
[ my-data.db ] modified       --> [ delta-file-1.diff ]

有没有办法基于新文件构造 [ delta-file-1.diff ]无需访问旧文件?(可能是通过为原始文件存储某种签名?)

我对此主题进行了很多研究(rdiff、PatchAPI、ZDelta、XDelta、MSDelta 等),但我找不到任何关于此的实际工作示例。

这些参考资料谈到了这一点,但我想听听是否有人可以指导我和/或建议更好的工具来回答我上面提出的问题。

在没有源文件的情况下压缩目标

Windows 补丁 API:在没有基础(源)文件的情况下压缩目标

提前致谢!

4

3 回答 3

1

当您仅附加到文件或编辑已知大小的块时(对于文本文件很可能不可能),我猜散列是可行的。参见 eMule 的 AICH(eMule wiki / aMule wiki)。

本质上,您将文件拆分为大小为 N 的块,并计算每个块的哈希码。然后你从 M 个块中计算出一个“超级哈希”。使用这种方法,您可以跟踪更改的块,而无需传输大量元数据。

否则:在不知道差异的基础的情况下,您无法从差异中创建整个文件。你也不能在不知道基础的情况下创建差异。

于 2012-02-25T07:12:47.340 回答
1

不,如果没有获得 A 和 B 的方法,您就无法获得与 A 和 B 的区别。

您可以从旧版本的 A 重构 A 并应用差异。

A的签名不会削减它。

于 2012-02-25T07:13:01.460 回答
1

对于那些感兴趣的人:有一个rdiff,它确实有一个 windows 端口,可以从 Delphi 启动,还有librsync,如果我理解正确的话,它是 rdiff 背后的引擎。

两者都需要旧文件(比文件本身小得多)和完整的新文件的签名。

可以进行反向增量以允许从旧文件中获取新文件。

于 2012-03-19T01:15:29.173 回答