Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Общие вопросы > Поиск файлов и сверка с базой сигнатур |
Автор: VIAL 5.7.2005, 05:19 | ||||
Поиск файлов и сверка с базой сигнатур Пишу программу, которая должна, ищя на компьютере файлы, сличать их сигнатуры со своей базой и в случае совпадения, производить некоторые действия. Примерный скелет я набросал.
Надо при нахождении любого файла записывать путь до него в переменную и считать сигнатуру функцией (с ней проблем не возникает), а потом сверять с имеющимися в базе сигнатурами. Загвоздка возникла с реализацей функции поиска. Посмотрел в MSDN _findfile, _nextfile. Попытался реализовать - возникла ошибка. Скорее всего, я не понял, как их использовать. Нашел в форуме код для Builder и переделал для M$VS - на чем пишу программу:
Вопрос в том, какой алгоритм поиска быстрее. Натолкните, пожалуйста. |
Автор: En_t_end 5.7.2005, 07:21 |
Мне показалось, что у тебя слишком действий происходит в поиске. На самом деле чистый поиск - это тоже самое, что в проводнике папку открыть. Поэтому вся ответсвенность за "тормоза" ложиться на сверку параметров. ... А дык тут у тебя рекурсия ![]() |
Автор: VIAL 5.7.2005, 09:38 | ||
Понятное дело, что рекурсия - тормоз. А как от нее избавиться, если надо целый диск, начиная с корня проверить? Как быть в случае с большой базой сигнатур? Вот немного подправил, чтобы хоть работало. В каталоге C:\11\ для демонстрации работы должно находиться два txt-файла с таким _целочисленным_ содержанием: первый 222052120 и второй соответственно 35432457667567765765765 (без переноса каретки и пробелов) В файле сигнатур одну из десяти первых следует выбрать 48 Максимальное значение сигнатуры (unsigned long int) равно 4294967295
Собственно, вопрос еще один есть, но задать я его смогу только после оптимизации функции поиска. |
Автор: vadims 9.7.2005, 19:51 |
VIAL ИМХО 1. Код приведенный в самом вопросе вообще задачи не решает 2. На самом поиске/переборе файло ты уже ничего не оптимизируешь - тут у тебя минимально возможный и необходимый набор операций для этого. Пытаться оптимизировать нужно уже непосредственно работу с найденным файлом - если это возможно - нет, значит ты достиг "предела совершенству". Можно конечно реализовать рекурсии через итерации, но там другие вопросы вылезут 3. Сам код перебора я бы сделал покрасивше, а именно - у тебя в текте будут повторять ся одни и те же операции после FindFirstFile и FindNextFile Я бы сделал как то так hfound=FindFirstFile(...) while( hfound ) { . . . // работа с найденным файлом hfound=FindNextFile(...) } |
Автор: VIAL 10.7.2005, 23:24 |
Спасибо. Поправим. |
Автор: comcon1 12.7.2005, 12:13 |
Оптимизировать поиск можно, но поиск В БАЗЕ!! Я так понимаю, база будет большая, не 10 элементов. Организуй ее как std::set - поиск в этом контейнере проходит за логарифмическое время. И используй вместо обычных вызовов - системные. Типа open, close. Так точно быстрее пойдет. |
Автор: vadims 12.7.2005, 12:25 |
comcon1 В смысле в базе - не вьехал какую базу ты имеешь в виду ??? Предлагаешь копию структуры файлов-каталогов делать - а обновлять как ?? Или что ??? |
Автор: comcon1 12.7.2005, 12:28 |
Ну он вычисленную контр. сумму ищет в своей базе данных - в массиве каком-то из 10 элементов. Но, я так понимаю, это заглушка, а в реал-проге этот массив будет скачиваться из файла и будет большим. И поиск вычисленной контрсуммы в нем надо проводить биарный, а не переборный. Я это имел в виду. |