обнаружение, если два файла строго идентичны, что сравнивать? - PullRequest
2 голосов
/ 01 февраля 2011

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

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

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

спасибо стив

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

Ответы [ 3 ]

2 голосов
/ 01 февраля 2011

Из чего состоит файл? В современной файловой системе (скажем, NTFS) у вас есть

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

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

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

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

1 голос
/ 01 февраля 2011

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

GetAccessControl
GetAttributes
GetCreationTime
...
ReadAllBytes

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

0 голосов
/ 01 февраля 2011

Вам нужно 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...