В директории файловой системы найти дублирующиеся по содержимому файлы - C#
Формулировка задачи:
Здравствуйте, имеется задача:
"В директории файловой системы найти дублирующиеся по содержимому файлы.
На первом шаге для каждого файла вычислить md5-хеш и сопоставить имени
файла (использовать словарь).
На втором шаге всем вычисленным хэшам сопоставить файлы
("перевернуть" предыдущую структуру данных, получится словарь
хеш/список_файлов).
Шаги 1 и 2 могут буть объединены.
На последнем шаге обработать хеши, которым сопоставлено несколько файлов,
а именно для этих файлов выполнить побайтное сравнение содержимого."
Я написал первый шаг:
Дальше как я понял надо поменять местами TKey и TValue, но как это сделать, если повторные ключи не добавляется, а они будут в любом случае, ведь в этом смысл задачи. Мне предлагали вместо Dictionary<string, string> использовать Dictionary<string, List<string>>, но как тогда добавлять элементы, ведь dictionary.Add(file.FullName, ComputeMD5Checksum(file.FullName)); работать больше не будет?
using System; using System.IO; using System.Collections.Generic; using System.Security.Cryptography; class MainClass { public static Dictionary<string, string> dictionary = new Dictionary<string, string>(); public static void PrintFiles(string dir) { DirectoryInfo dirInfo = new DirectoryInfo(dir); FileInfo[] files = dirInfo.GetFiles(); foreach (FileInfo file in files) { dictionary.Add(file.FullName, ComputeMD5Checksum(file.FullName)); } DirectoryInfo[] dirs = dirInfo.GetDirectories(); foreach (DirectoryInfo d in dirs) PrintFiles(d.FullName); } public static void Main(string[] args) { PrintFiles("C:\"); Console.ReadKey(true); } public static string ComputeMD5Checksum(string path) { using (FileStream fs = System.IO.File.OpenRead(path)) { MD5 md5 = new MD5CryptoServiceProvider(); byte[] fileData = new byte[fs.Length]; fs.Read(fileData, 0, (int)fs.Length); byte[] checkSum = md5.ComputeHash(fileData); string result = BitConverter.ToString(checkSum).Replace("-", String.Empty); return result; } } }
Решение задачи: «В директории файловой системы найти дублирующиеся по содержимому файлы»
textual
Листинг программы
// ключ - путь к файлу, значение - хэш файла Dictionary<string, string> filesToHash = ComputeHashForFiles(...); // ключ - хэш файла, значение - список путей к файлам с таким хэшем Dictionary<string, List<string>> hashToFiles = new Dictionary<string, List<string>>(); // пробегаемся по первой коллекции и ... делаем магию! foreach (var entry in filesToHash) { List<string> filesForHash = null; bool exists = hashToFiles.TryGetValue(entry.Value, out filesForHash); if (exists) { filesForHash.Add(entry.Key); } else { filesForHash = new List<string>(2); filesForHash.Add(entry.Key); hashToFiles.Add(entry.Value, filesForHash); } } // по окончанию цикла foreach получаем корректно сформированный словарь соответствий // хэш -> список файлов с таким хэшем // остаётся только определить, есть ли в коллекции hashToFiles List с Count > 1
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д