说我有A.doc文件。
然后我将它复制到b.doc并将其移动到另一个目录
对我来说,它仍然是同一个文件
但我怎么能确定它呢?
当我下载文件时,我有时会读到关于获取mda5的东西或校验和,但我不知道那是什么。
有没有办法检查这些文件是否是二进制相等的?
答案 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)