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

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

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

Здравствуйте, имеется задача: "В директории файловой системы найти дублирующиеся по содержимому файлы. На первом шаге для каждого файла вычислить md5-хеш и сопоставить имени файла (использовать словарь). На втором шаге всем вычисленным хэшам сопоставить файлы ("перевернуть" предыдущую структуру данных, получится словарь хеш/список_файлов). Шаги 1 и 2 могут буть объединены. На последнем шаге обработать хеши, которым сопоставлено несколько файлов, а именно для этих файлов выполнить побайтное сравнение содержимого." Я написал первый шаг:
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;
        }
    }
 
}
Дальше как я понял надо поменять местами TKey и TValue, но как это сделать, если повторные ключи не добавляется, а они будут в любом случае, ведь в этом смысл задачи. Мне предлагали вместо Dictionary<string, string> использовать Dictionary<string, List<string>>, но как тогда добавлять элементы, ведь dictionary.Add(file.FullName, ComputeMD5Checksum(file.FullName)); работать больше не будет?

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

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

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


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

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

11   голосов , оценка 3.818 из 5
Похожие ответы