Задачи
April 24, 2023

Задача. Как найти дубликаты в файловой системе?!

Задача. Учитывая список путей информации о каталоге, включая путь к каталогу и все файлы с содержимым в этом каталоге, вернуть все дубликаты файлов (по содержимому) в файловой системе с точки зрения их путей. Вы можете вернуть ответ в любом порядке.

Одна строка информации о каталоге во входном списке имеет следующий формат:

"root/d1/d2/.../dm f1.txt(f1_content) f2.txt(f2_content) ... fn.txt(fn_content)"

Это означает, что в каталоге "root/d1/d2/.../dm" имеется n файлов (f1.txt, f2.txt ... fn.txt) с содержимым (f1_content, f2_content ... fn_content) соответственно.

Справка:

Путь к файлу — это строка, имеющая следующий формат: "путь_каталога/имя_файла.txt"

Пример:

Paths: [
"root/a 1.txt(abcd) 2.txt(efgh)",
"root/c 3.txt(abcd)",
"root/c/d 4.txt(efgh)",
"root 4.txt(efgh)"
]

Output: [
["root/a/2.txt","root/c/d/4.txt","root/4.txt"],
["root/a/1.txt","root/c/3.txt"]
]

Разбор

Классическая задача на парсинг строк. В качестве основной структуры данных для сбора результирующих строк будем использовать словарик, где ключ - это содежимое файла (content), а значение - лист, где каждый элемент - это полный путь файла с таким содержимым.

ContentMap<string, List<string>>: { content } → filePaths[]

В цикле будем парсить каждый исходный путь файла: вычленим путь и содержимое и запишем все в ContentMap.

Результатом будет список всех значений ContentMap. Детали смотрите ниже в реализации.

Реализация

Play-test

https://dotnetfiddle.net/En6hh8