在没有基础(源)文件的情况下制作增量文件?

时间:2012-02-25 06:14:51

标签: delphi diff rsync delta

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

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

我有这个项目,我将文件上传到服务器,我需要优化上传,所以如果我只能上传增量文件而不是发送新文件然后比较旧文件,那么它真的很棒。服务器上的新文件版本。

我读到了Duplicity here

  

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

这让我想到,是否有一种工具(或方法)基于文件生成补丁或增量文件(我不确定适当的术语是什么),< strong>没有可以访问原始文件吗?

我的意思是说我有一个我修改过的文件:

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

有没有办法根据新文件构建[delta-file-1.diff]而不可以访问旧文件? (可能是通过为原始文件存储某种签名?)

我研究了很多这个主题(rdiff,PatchAPI,ZDelta,XDelta,MSDelta等等),但我找不到任何真实的工作实例。

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

Compressing a Target Without a Source File

Windows Patch API: Compressing a Target Without a Basis (Source) File

提前致谢!

3 个答案:

答案 0 :(得分:1)

当你只附加到文件或编辑已知大小的块(很可能不是文本文件)时,我猜哈希是可行的。请参阅eMule的AICH(eMule wiki / aMule wiki)。

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

否则:你不能在不知道差异所依据的基础上从差异中创建整个文件。你也不能在不知道基础的情况下创造差异。

答案 1 :(得分:1)

如果没有获得A和B的方法,你就无法从A和B中获得差异。

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

A的签名不会削减它。

答案 2 :(得分:1)

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

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

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