2008-10-22 105 views
4

我需要用C++编写一个工具来确定文件中已更改的位与另一个要复制的文件进行比较。完成此操作的最佳方法是什么?确定C++中已更改数据的最佳方法

我没有具体的操作系统或库,我乐于接受建议。我的主要目标是减少复制涉及的网络流量。

回答

17

查看rsync - 它将文件拆分成块,计算每个块的校验和,并仅传输校验和以确定在传输块数据之前是否存在任何变化(仅在需要时)。

+0

实际上它甚至比它更好 - 它使用滚动校验和,即使它们已经移动到非块对齐的位置,也可以检测相等的块。 – ephemient 2008-10-22 18:44:14

+0

在我写回答时,我意识到你忘了提及rsync的一个很好的卖点:它在没有在发送者机器上同步文件的两个版本的情况下工作。 – Alexander 2008-10-22 23:24:12

3

如果你不能用rsync的原样,检查librsync。这是旧的,但代码很容易阅读和改进。

0

建议:使用散列函数&除法&征服方法来缩小变化块。不完全是防碰撞解决方案,但SHA-2 IMO可以为您工作。

2

如果在同一台机器上没有旧版本和新版本的文件,那么类似rsync的算法是前进的方向(请参阅以前的答案)。如果你在同一台机器上同时拥有旧版本和新版本的文件,那么你可以比rsync做得更好:生成压缩的差异并通过网络发送它们。

要生成有效的差异,请查看VCDIFF(RFC 3284)二进制增量压缩。一个很好的实现是xdelta(www.xdelta.org)。如果您想避免在接收端因为许可问题而使用xdelta,那么实现解码器/解压缩器相当容易。编写自己的VCDIFF差异生成器将会生成紧凑的差异,这非常复杂(例如,考虑搜索移动块)。

在VCDIFF中,diffs也可以是无源的,这意味着它们解压缩到目标文件中,而不需要任何源文件(应用diff的文件) - 在VCDIFF中压缩文件是创建两个文件之间压缩的增量。这很有用,因为无论目标是否具有文件版本,您都可以使用相同的格式。

相关问题