В директории файловой системы найти дублирующиеся по содержимому файлы - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, имеется задача: "В директории файловой системы найти дублирующиеся по содержимому файлы. На первом шаге для каждого файла вычислить md5-хеш и сопоставить имени файла (использовать словарь). На втором шаге всем вычисленным хэшам сопоставить файлы ("перевернуть" предыдущую структуру данных, получится словарь хеш/список_файлов). Шаги 1 и 2 могут буть объединены. На последнем шаге обработать хеши, которым сопоставлено несколько файлов, а именно для этих файлов выполнить побайтное сравнение содержимого." Я написал первый шаг:
Листинг программы
  1. using System;
  2. using System.IO;
  3. using System.Collections.Generic;
  4. using System.Security.Cryptography;
  5. class MainClass
  6. {
  7. public static Dictionary<string, string> dictionary = new Dictionary<string, string>();
  8.  
  9. public static void PrintFiles(string dir)
  10. {
  11. DirectoryInfo dirInfo = new DirectoryInfo(dir);
  12. FileInfo[] files = dirInfo.GetFiles();
  13. foreach (FileInfo file in files)
  14. {
  15. dictionary.Add(file.FullName, ComputeMD5Checksum(file.FullName));
  16. }
  17. DirectoryInfo[] dirs = dirInfo.GetDirectories();
  18. foreach (DirectoryInfo d in dirs)
  19. PrintFiles(d.FullName);
  20.  
  21. }
  22. public static void Main(string[] args)
  23. {
  24.  
  25. PrintFiles("C:\");
  26.  
  27. Console.ReadKey(true);
  28. }
  29. public static string ComputeMD5Checksum(string path)
  30. {
  31. using (FileStream fs = System.IO.File.OpenRead(path))
  32. {
  33. MD5 md5 = new MD5CryptoServiceProvider();
  34. byte[] fileData = new byte[fs.Length];
  35. fs.Read(fileData, 0, (int)fs.Length);
  36. byte[] checkSum = md5.ComputeHash(fileData);
  37. string result = BitConverter.ToString(checkSum).Replace("-", String.Empty);
  38. return result;
  39. }
  40. }
  41. }
Дальше как я понял надо поменять местами TKey и TValue, но как это сделать, если повторные ключи не добавляется, а они будут в любом случае, ведь в этом смысл задачи. Мне предлагали вместо Dictionary<string, string> использовать Dictionary<string, List<string>>, но как тогда добавлять элементы, ведь dictionary.Add(file.FullName, ComputeMD5Checksum(file.FullName)); работать больше не будет?

Решение задачи: «В директории файловой системы найти дублирующиеся по содержимому файлы»

textual
Листинг программы
  1. // ключ - путь к файлу, значение - хэш файла
  2. Dictionary<string, string> filesToHash = ComputeHashForFiles(...);
  3.  
  4. // ключ - хэш файла, значение - список путей к файлам с таким хэшем
  5. Dictionary<string, List<string>> hashToFiles = new Dictionary<string, List<string>>();
  6.  
  7. // пробегаемся по первой коллекции и ... делаем магию!
  8. foreach (var entry in filesToHash)
  9. {
  10.     List<string> filesForHash = null;
  11.     bool exists = hashToFiles.TryGetValue(entry.Value, out filesForHash);
  12.     if (exists)
  13.     {
  14.         filesForHash.Add(entry.Key);
  15.     }
  16.     else
  17.     {
  18.         filesForHash = new List<string>(2);
  19.         filesForHash.Add(entry.Key);
  20.         hashToFiles.Add(entry.Value, filesForHash);
  21.     }
  22. }
  23.  
  24. // по окончанию цикла foreach получаем корректно сформированный словарь соответствий
  25. // хэш -> список файлов с таким хэшем
  26. // остаётся только определить, есть ли в коллекции hashToFiles List с Count > 1

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы