Обнаружение, если два файла строго идентичны, что сравнивать?

Я хотел бы знать, как сравнить два файла, чтобы определить, является ли он точно таким же. Я знаю, как сравнить имя файла, дату создания / изменения и даже хэш, если это необходимо.

Однако я не знаю, как сравнивать метаданные файла (на самом деле я не знаю, как он хранится): настройки безопасности, настройки совместимости, временная метка антивируса и т. Д.

моя конечная цель - провести глубокое сравнение двух файловых систем на разных компьютерах

спасибо Стив

[править], чтобы уточнить, я переформулирую название вопроса

3 ответа

Решение

Что представляет собой файл? На современной файловой системе (скажем NTFS) у вас есть

  • Атрибуты файла (время, атрибуты FAT)
  • безымянный файловый поток
  • ноль или более альтернативных потоков данных (ADS)
  • Расширенные атрибуты
  • NTFS безопасность (она хранится в ADS, но мы можем идентифицировать ее отдельно)

Остальное (конфигурация, временная метка антивируса / что это такое / и т. Д.) Хранится вне файла и не является файлом.

Поэтому вам нужно проверить вышеупомянутые биты файла и сравнить их.

Существуют разные методы для чтения разных частей информации, и вам нужно использовать их все, чтобы собрать их все и сравнить их для разных файлов.

Просто проработайте все методы получения в System.IO.File.

GetAccessControl
GetAttributes
GetCreationTime
...
ReadAllBytes

Если есть что-то еще, от чего зависит ваше определение "одного и того же файла" (например, абсолютный путь, если на разных машинах), то получите и это, но вы еще не поняли, что это такое.

Вам нужно MD5, SHA хэшировать оба файла и сравнивать, если у обоих одинаковая сумма.

Проверьте MD5CryptoServiceProvider и SHA512CryptoServiceProvider в System.Security.Cryptography.

Это что-то вроде этого:

private string ComputeHashAsText(byte[] fileBytes)
{
    using (SHA512CryptoServiceProvider cryptoService = new SHA512CryptoServiceProvider())
    {
        return Encoding.ASCII.GetString(cryptoService.ComputeHash(fileBytes));
    }
}

public bool CompareFiles(string pathA, string pathB)
{
    string hashPathA = ComputeHashAsText(File.ReadAllBytes(pathA));
    string hashPathB = ComputeHashAsText(File.ReadAllBytes(pathB));

    return hashPathA == hashPathB;
}

В реальном решении вы можете захотеть вычислить хеш в блоках или что-то вроде этого, потому что, возможно, файлы для сравнения слишком велики, чтобы прочитать все байты в память и хешировать их.

Другие вопросы по тегам