2010-12-14 86 views
2

我碰到这个代码http://support.microsoft.com/kb/320348,这让我想知道为了弄清楚它们是否有区别,比较两个文件的最佳方法是什么。逐字节比较文件还是读取所有字节?

主要想法是优化我的程序,需要验证任何文件是否相同,以创建删除/创建的已更改文件和/或文件的列表。

目前我比较文件的大小,如果他们匹配我会进入一个md5校验的2个文件,但在看到这个问题的开始时链接的代码后,它让我想知道它是否真的值得使用它来创建2个文件的校验和(这基本上是在获得所有字节后)?

我还应该做些什么其他验证来减少检查每个文件的工作?

+0

我认为这很大程度上取决于你平等的意思。你想测试文件中的文本或实际字节的相等性吗?文件的内容是什么?空间是否重要(文本平等)? MD5校验和会在行的末尾找到2个空格和1个空格之间的差异,其中简单的文本比较可能不会。 – linuxuser27 2010-12-14 00:55:35

+0

MD5需要将这两个文件全部读取,然后对大文件执行哈希操作,这可能非常耗时。 – Aliostad 2010-12-14 00:57:21

+0

这就是为什么我想知道这个问题,Aliostad和Anon提出了我想知道的观点。 – Prix 2010-12-14 02:17:12

回答

4

阅读两个文件到被用于读取优化的小缓冲器(4K或8K),然后在比较存储器缓冲器,其用于比较优化(逐字节)。

这会给你所有情况下的最佳性能(差异在开始,中间或结束时)。

当然第一步是检查是否文件长度不同,如果是这样的话,这些文件是不同的..

+0

+1谢谢,最初我已经在进入校验和之前检查文件的大小。但是现在我将确保将它从校验和更改为具有小缓冲区的流,无论如何我都会检测到文件是否等于对等?我二进制,文本或W/E文件是... – Prix 2010-12-14 02:15:25

0

如果您还没有计算文件的哈希值,那么你不妨做一个适当的比较(而不是看哈希),因为如果文件是相同的,它的工作量是相同的,但如果它们不同,你可以更早地停下来。

当然,一次比较一个字节可能有点浪费 - 可能是一次读取整个块并比较它们的好主意。