Обнаружение, если два файла строго идентичны, что сравнивать?
Я хотел бы знать, как сравнить два файла, чтобы определить, является ли он точно таким же. Я знаю, как сравнить имя файла, дату создания / изменения и даже хэш, если это необходимо.
Однако я не знаю, как сравнивать метаданные файла (на самом деле я не знаю, как он хранится): настройки безопасности, настройки совместимости, временная метка антивируса и т. Д.
моя конечная цель - провести глубокое сравнение двух файловых систем на разных компьютерах
спасибо Стив
[править], чтобы уточнить, я переформулирую название вопроса
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;
}
В реальном решении вы можете захотеть вычислить хеш в блоках или что-то вроде этого, потому что, возможно, файлы для сравнения слишком велики, чтобы прочитать все байты в память и хешировать их.