如何使用.NET检查2个文件是否相等?

时间:2010-03-02 08:18:29

标签: c#

说我有A.doc文件。
然后我将它复制到b.doc并将其移动到另一个目录 对我来说,它仍然是同一个文件 但我怎么能确定它呢? 当我下载文件时,我有时会读到关于获取mda5的东西或校验和,但我不知道那是什么。

有没有办法检查这些文件是否是二进制相等的?

3 个答案:

答案 0 :(得分:14)

如果你想100%确定文件中的确切字节是相同的,那么打开两个流并比较文件的每个字节是唯一的方法。

如果你只是想确定(99.9999%?),我会计算每个文件的MD5哈希并比较哈希值。查看System.Security.Cryptography.MD5CryptoServiceProvider。

在我的测试中,如果文件通常是等效的,那么比较MD5哈希值比比较文件的每个字节快三倍。
如果文件通常不同,那么逐字节比较会快得多,因为您不必读取整个文件,只要单个字节不同就可以停止。

编辑:我最初根据快速测试得出这个答案,该测试从每个文件逐字节读取,并逐字节地比较它们。我错误地认为System.IO.FileStream的缓冲特性可以避免担心硬盘块大小和读取速度;这不是真的。我重新测试了我的程序,它从4096个字节块中读取每个文件,然后比较块 - 这个方法总体上比MD5略快,即使文件完全相同,如果它们不同,当然会快得多。

我将此答案作为关于FileStream类的温和警告,因为我仍然认为它具有一定的价值作为“我如何计算.NET中文件的MD5”的答案。除此之外,它不是满足原始​​请求的最佳方式。

计算两个文件的MD5哈希值的示例(现已测试!):

using (var reader1 = new System.IO.FileStream(filepath1, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
    using (var reader2 = new System.IO.FileStream(filepath2, System.IO.FileMode.Open, System.IO.FileAccess.Read))
    {
        byte[] hash1;
        byte[] hash2;

        using (var md51 = new System.Security.Cryptography.MD5CryptoServiceProvider())
        {
            md51.ComputeHash(reader1);
            hash1 = md51.Hash;
        }

        using (var md52 = new System.Security.Cryptography.MD5CryptoServiceProvider())
        {
            md52.ComputeHash(reader2);
            hash2 = md52.Hash;
        }

        int j = 0;
        for (j = 0; j < hash1.Length; j++)
        {
            if (hash1[j] != hash2[j])
            {
                break;
            }
        }

        if (j == hash1.Length)
        {
            Console.WriteLine("The files were equal.");
        }
        else
        {
            Console.WriteLine("The files were not equal.");
        }
    }
}

答案 1 :(得分:9)

首先比较文件的大小,如果大小不一样则文件不同,如果大小相同,则只需比较文件内容。

答案 2 :(得分:2)

确实有。打开这两个文件,以字节数组的形式读取它们,并比较每个字节。如果它们相等,则文件相同。