比较C ++中的两个文件

时间:2012-02-27 12:02:29

标签: c++ windows file

我有一个比较两个文件的功能,看看它们是否相同。它逐字节读取文件并检查它们是否相同 我现在遇到的问题是,对于大文件,这个功能需要相当长的时间。

检查文件是否相同的更好,更快的方法是什么?

5 个答案:

答案 0 :(得分:7)

当您的文件不相同时,它们的大小可能相同吗?如果没有,你可以立即确定文件大小(fseek到最后,ftell来确定位置),如果它们不同,那么你知道它们在不比较数据的情况下是不一样的。如果尺寸相同,请记住回到开头。

如果将文件读入大内存缓冲区并使用memcmp()比较每个缓冲区,则可以提高性能。您不必一次读取整个文件,只需设置一个大的缓冲区大小并从每个文件读取该大小的块,用于循环中的每个比较迭代。 memcpy函数将以32位值运行,而不是8位字节。

答案 1 :(得分:2)

如果你真的想要对两个文件进行强力比较,mmaping may help

如果您知道正在阅读的内容的文件结构,请阅读允许您快速识别它们的唯一部分(例如标题和相关的块/部分)。当然,您需要在比较之前获得其基本属性。

如果进行多重比较,则生成哈希(或其他内容)。

答案 2 :(得分:0)

以大小为X的块读取文件。使用X最高1-10-50兆字节。在这些块上使用memcmp()

答案 3 :(得分:0)

虽然有许多使用SHA或MD5的加密哈希函数的例子,但是对于文件比较,最好使用非加密哈希,因为它会更快:

https://en.wikipedia.org/wiki/List_of_hash_functions#Non-cryptographic_hash_functions

根据您的需要,FNV哈希被认为是快速的:

https://en.wikipedia.org/wiki/Fowler_Noll_Vo_hash

答案 4 :(得分:-1)

如果您不熟悉谷歌上关于“MD5”或“SHA”算法的哈希搜索。 散列是检查文件一致性的有效方法之一。 只有你需要找到其中一种算法的实现并检查它们;例如:

if(md5(file1Path) == md5(file2Path))
    cout<<"Files are equal"<<endl;
else
    cout<<"Files are not equal"<<endl;