通过网络有效复制文件的算法

时间:2011-12-05 21:28:56

标签: c# checksum file-copying file-read

我知道有几个程序可以通过网络同步文件。不是他们做我一直在想的事情。让我解释一下我想要实现的目标......

在我的网络中,有几台计算机共享相同的文件。例如,quickbooks文件由几台计算机访问,它是一个大文件。还有来自outlook的pst文件也很大。每天晚上我们通过网络在已经更改的文件上创建备份。我认为如果它有一些小的修改,它不会复制整个1 GB的文件。所以我想提出一种比较文件部分的算法。

例如,假设outlook pst文件由字节组成:

1, 2, 3, 4, 5, 6, 7, 8, 9    

如果我收到电子邮件,则字节现在为:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10    for example

现在不是发送整个文件而是更容易发送字节10

所以实际上文件有几千个字节所以我会做每兆字节文件的校验和,所以现在我的表应该是这样的:

aaa1, aaa2, aaa3, abf8, etc...   

如果现在接收电子邮件,则pst文件的表格为:

aaa1, aaa2, aaa3,  7a8b, etc  ... then I know that the first 3 megabits are the same and I should send just one megabite instead of the entire file...

我认为如果在文件末尾添加内容,这个算法会很好用,但实际上在文件开头可能会改变一个字节而我的算法不会起作用。例如,如果在文件开头添加一个字节,则所有十六进制代码都将更改...

如何让算法更有效率?如果我可以发送部分文件而不是整个文件

,那就太好了

2 个答案:

答案 0 :(得分:3)

rsync协议将有效地同步大小差异的大文件。它比你设想的方案要聪明得多,所以你应该在开始自己的解决方案之前阅读Tridgell和Mackerras的write-up,或者只使用rsync。有一个免费的Windows包装器here

答案 1 :(得分:2)

您可能需要查看rolling checksumsalgorithm rsync uses

基本上,如上所述在块上计算哈希值,但您也计算滚动校验和。滚动校验和具有允许您更有效地检查的属性,例如,一个字节被附加到文件的开头。