Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 在没有基础(源)文件的情况下生成增量文件?_Delphi_Diff_Rsync_Delta - Fatal编程技术网

Delphi 在没有基础(源)文件的情况下生成增量文件?

Delphi 在没有基础(源)文件的情况下生成增量文件?,delphi,diff,rsync,delta,Delphi,Diff,Rsync,Delta,(好吧,别对我大喊大叫,这里已经很晚了:)) 我正在研究delta diff工具(命令行工具或组件,只要我可以从Delphi 2010调用它们就行了) 我有一个项目,我上传文件到服务器,我需要优化上传,所以如果我可以上传增量文件,而不是发送新文件,然后在服务器上比较新旧文件版本,这将是非常棒的 我读到了口是心非的故事 Duplicity是rdiff备份的一种变体,它允许备份时不需要来自 存储服务器,与简单的存储服务(如AmazonS3)一样。它的工作原理是 提前为每个块生成哈希,对其进行加密,并

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

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

我有一个项目,我上传文件到服务器,我需要优化上传,所以如果我可以上传增量文件,而不是发送新文件,然后在服务器上比较新旧文件版本,这将是非常棒的

我读到了口是心非的故事

Duplicity是rdiff备份的一种变体,它允许备份时不需要来自 存储服务器,与简单的存储服务(如AmazonS3)一样。它的工作原理是 提前为每个块生成哈希,对其进行加密,并将其存储在 服务器,然后在执行增量备份时检索它们。其余的数据是 出于安全目的,还对其进行了加密存储

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

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

my-data.db
[ my-data.db ] modified       --> [ delta-file-1.diff ]
是否有一种方法可以基于新文件构造[delta-file-1.diff],而不访问旧文件?(可能是通过存储原始文件的某种签名?)

我在这个主题上做了很多研究(rdiff、PatchAPI、ZDelta、XDelta、MSDelta等等),但我找不到任何实际的工作示例

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


提前谢谢

当您仅附加到文件或在已知大小的块中编辑时(对于文本文件很可能不可能),我想哈希是可行的。参见eMule的AICH(/)

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


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

不,如果没有得到a和B的方法,你就无法从a和B中得到差异

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


A的签名不会阻止它。

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

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


反向增量可以用来从旧文件中获取新文件。

你想在不知道A的情况下获得A和B之间的差异吗?@Kay:这一点很好,我宁愿说我想获得A和B之间的差异,只需要手头有A的“签名”(识别A可能是什么的一系列散列?)。问这个问题真的没有什么丢脸的,你know@Ken:请阅读我的评论,确实有一种方法可以做到这一点,唯一要知道的是哪种工具是最好的(我只能找到一种软件可以做到这一点:rdiff)。在我的问题中提到的MSDN链接中,我发现:“在没有源文件的情况下压缩目标描述了如何使用API函数在不引用源文件的情况下创建增量。”我对MS不太信任,但除非我误读了这一点,否则这似乎是可能的(?)不管你是否相信MS,我认为你误读了你在编辑的问题中提到的。该链接表明
如果调用了CreatePatch函数,并且源文件被指定为NULL或无效的句柄值,则输出将是目标文件的压缩表示。
这意味着增量将只描述目标文件B、 不是源A和目标B之间的区别。好吧,经过一些研究,我最终决定不接受答案。首先,dropbox显然实现了类似的功能,其次,补丁程序在同一台机器上没有两个文件(即使用文件签名),已经在中实现(嗯,有点)在《谢谢你,是的!》中,这正是我所想的(每个片段/块的哈希)。然而,我相当怀疑,但你的超级哈希的想法非常有趣,很可能会奏效……我要看一看,谢谢!@Gdhami
rsync
通过计算块的哈希来工作(因此,它只需要发送实际不同的块的差异,而不是通过线路发送A和B之间的完整差异)。但它仍然需要完整的A和完整的B。@Jeroenwiertplaimers:我有点希望找到一些“神奇的”“实现这一目标的方法。谢谢你们的帮助,我真的很感激!@Gdhami非常欢迎你们,我很高兴你们找到了我们的帮助。”。