Ответ 1
Если вы хотите быть на 100% уверенным, что точные байты в файле совпадают, то открытие двух потоков и сравнение каждого байта файлов - единственный способ.
Если вы просто хотите быть уверенным (99.9999%?), я бы вычислил хеш MD5 каждого файла и сравнил хэши вместо этого. Проверьте System.Security.Cryptography.MD5CryptoServiceProvider.
В моем тестировании, если файлы обычно эквивалентны, сравнение хешей MD5 примерно в три раза быстрее, чем сравнение каждого байта файла.
Если файлы обычно различаются, сравнение побайтов будет намного быстрее, потому что вам не нужно читать весь файл, вы можете остановиться, как только один байт отличается.
Изменить: я изначально основывал этот ответ на быстром тесте, который читал из каждого файла побайтно, и сравнивал их побайтно. Я ошибочно полагал, что буферизованный характер System.IO.FileStream не позволит мне беспокоиться о размерах блоков жесткого диска и скорости чтения; это было неправдой. Я протестировал мою программу, которая читает из каждого файла в 4096 байтовых фрагментах, а затем сравнивает куски - этот метод немного быстрее, чем MD5, даже если файлы абсолютно одинаковы и, конечно же, будут намного быстрее, если они будут отличаться.
Я оставляю этот ответ как мягкое предупреждение о классе FileStream, и потому что я все еще думаю, что имеет некоторое значение в качестве ответа на вопрос "как вычислить MD5 файла в .NET". Кроме того, это не лучший способ выполнить первоначальный запрос.
пример вычисления хешей 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.");
}
}
}