Подтвердить что ты не робот

Как проверить, равны ли 2 файла с помощью .NET?

Скажем, у меня есть файл A.doc.
затем я скопирую его в b.doc и перевежу в другой каталог.
для меня это все тот же файл.
но как я могу определить, что это? когда я скачиваю файлы, я иногда читаю о получении mda5 что-то или контрольной суммы, но я не знаю, что это значит.

Есть ли способ проверить, равны ли эти файлы равными?

4b9b3361

Ответ 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.");
        }
    }
}

Ответ 2

Сначала сравните размер файлов, если размер не совпадает, а файлы разные, если размер один и тот же, а затем просто сравните содержимое файлов.

Ответ 3

Действительно, есть. Откройте оба файла, прочитайте их как массивы байтов и сравните каждый байт. Если они равны, то файл равен.