![]() |
Как искать идентичные файлы?
У меня задание:
Написать программу которая бы искала идентичные файлы. Входными данными являются пути к директориям. Результатом работы должен быть список найденных идентичных файлов. Поскольку я раньше все делал на C# то решил юзать "System" и "Windows Forms" короче CLR приложение. И GUI делать легко и типов удобных достаточно. Но когда вопрос дошел к реализации алгоритма поиска и сравнения файлов - тут я немного запутался... Я расскажу как я придумал искать идентичные файлы, а потом задам вам вопросы. Весь процесс поиска будет состоять из 2-х этапов:
Вопросы:
пока что все... Заранее СПАСИБО за ответы! ;) |
Ответ: Как искать идентичные файлы?
можно стандартными средствами создать хеш-суммы файлов (например md5), потом найти все пары файлов чьи хеш-суммы совпадают и проверить уже эти пары на побайтовое совпадение
|
Ответ: Как искать идентичные файлы?
Цитата:
Каким контейнером пользоваться, чтобы сравнение элементов между собой занимало поменьше времени? БД с данными файлов я создам как класс внутри которого будет контейнер (массив) с данными файлов (путь к файлу, размер файла). Конструктор класса будет принимать контейнер с путями директорий, искать в этих директориях файлы и заполнять их данными внутренний контейнер. А сам поиск идентичных файлов будет организован как метод, который после вычислений будет возвращать контейнер с данными идентичных файлов. Какой же тип контейнера выбрать?
|
Ответ: Как искать идентичные файлы?
ІГРОГРАЙКО
список наверно проще для тебя будет |
Ответ: Как искать идентичные файлы?
Очевидно нужно в бинарном дереве хранить чексуммы
|
Ответ: Как искать идентичные файлы?
Цитата:
Я чето не понял. :dontknow: Как хранить чексуммы в бинарном дереве, если 100% где то будут два одинаковых значения? И зачем? Ведь бинарное дерево нужно для сравнения "<" ">" а не для "=="? Или это я ошибаюсь... Объясни пожалуйста? |
Ответ: Как искать идентичные файлы?
Dictionary<int,List<std::wstring>> candidates;
|
Ответ: Как искать идентичные файлы?
Цитата:
Две чексуммы 100% совпадут? а разве не это нам нужно? Совпали значит нашли. |
Ответ: Как искать идентичные файлы?
Цитата:
в Dictionary<TKey,TValue> есть такая штука: Цитата:
Dictionary<String,long int> DB; где: String - єто пути к файлам (они не повторяются) long int - размеры фалов которые могут совпадать... Вот только если найдутся 2 записи с одинаковыми размерами, тогда уже буду драть MD5 с этих файлов. Это если они больше примерно 10-100МБ, все что меньше - побитовая проверка. Если у больших файлов MD5 совпало тогда и их на побитовою проверку... Что скажете? Может у вас есть идеи получше? |
Ответ: Как искать идентичные файлы?
Цитата:
Объясни пожалуйста что где должно хранится? |
Ответ: Как искать идентичные файлы?
Цитата:
|
Ответ: Как искать идентичные файлы?
Цитата:
|
Ответ: Как искать идентичные файлы?
Цитата:
в списке строк - пути к файлам с одинаковым хэшем алгоритм: 1) проходишься по всем файлам в выбранной папке рекурсивно. 2) добавляешь путь к списку файлов с таким хэшем: candidates[GetFileHash(filename)].push_back(filename); 3) после составления мапы проходишься по файлам в списке: Код:
for(auto ci = candidates.begin(), ei = candidates.end();ci!=ei;++ci) |
Ответ: Как искать идентичные файлы?
Ещё можно посоветовать не сравнивать файлы нулевого размера, у них чек сумма = 0, да и смысла их сравнивать нет, разве что по имени.
|
Ответ: Как искать идентичные файлы?
Вложений: 1
Добрый вечер!
Я вот уже сделал задание: Вложение 18825 Но мне дали дополнительное: Надо сделать так, чтобы GUI во время процессинга (поиска идентичных файлов) не зависало, а отвечало на разные действия юзверя. Я понял, что тут надо запустить процессинг в отдельном потоке, но у меня не получается запустить функцию внутри которой и вызов метода, что ищет идентичные файлы И изменение параметров контрола progressBar так, чтобы это все было в отдельном потоке... Помогите пожалуйста! Кто знает как пользоваться System::Threading!!! |
Часовой пояс GMT +4, время: 21:16. |
vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot