В директории файловой системы найти дублирующиеся по содержимому файлы - 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