В директории файловой системы найти дублирующиеся по содержимому файлы - 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д