![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
VIAL |
|
||||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.7.2005 Репутация: нет Всего: нет |
Поиск файлов и сверка с базой сигнатур
Пишу программу, которая должна, ищя на компьютере файлы, сличать их сигнатуры со своей базой и в случае совпадения, производить некоторые действия. Примерный скелет я набросал.
Надо при нахождении любого файла записывать путь до него в переменную и считать сигнатуру функцией (с ней проблем не возникает), а потом сверять с имеющимися в базе сигнатурами. Загвоздка возникла с реализацей функции поиска. Посмотрел в MSDN _findfile, _nextfile. Попытался реализовать - возникла ошибка. Скорее всего, я не понял, как их использовать. Нашел в форуме код для Builder и переделал для M$VS - на чем пишу программу:
Вопрос в том, какой алгоритм поиска быстрее. Натолкните, пожалуйста. Это сообщение отредактировал(а) VIAL - 5.7.2005, 06:59 |
||||
|
|||||
En_t_end |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2074 Регистрация: 4.12.2004 Репутация: 1 Всего: 20 |
Мне показалось, что у тебя слишком действий происходит в поиске. На самом деле чистый поиск - это тоже самое, что в проводнике папку открыть. Поэтому вся ответсвенность за "тормоза" ложиться на сверку параметров. ... А дык тут у тебя рекурсия
![]() |
|||
|
||||
VIAL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.7.2005 Репутация: нет Всего: нет |
Понятное дело, что рекурсия - тормоз. А как от нее избавиться, если надо целый диск, начиная с корня проверить?
Как быть в случае с большой базой сигнатур? Вот немного подправил, чтобы хоть работало. В каталоге C:\11\ для демонстрации работы должно находиться два txt-файла с таким _целочисленным_ содержанием: первый 222052120 и второй соответственно 35432457667567765765765 (без переноса каретки и пробелов) В файле сигнатур одну из десяти первых следует выбрать 48 Максимальное значение сигнатуры (unsigned long int) равно 4294967295
Собственно, вопрос еще один есть, но задать я его смогу только после оптимизации функции поиска. |
|||
|
||||
vadims |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 8.6.2005 Репутация: 2 Всего: 17 |
VIAL
ИМХО 1. Код приведенный в самом вопросе вообще задачи не решает 2. На самом поиске/переборе файло ты уже ничего не оптимизируешь - тут у тебя минимально возможный и необходимый набор операций для этого. Пытаться оптимизировать нужно уже непосредственно работу с найденным файлом - если это возможно - нет, значит ты достиг "предела совершенству". Можно конечно реализовать рекурсии через итерации, но там другие вопросы вылезут 3. Сам код перебора я бы сделал покрасивше, а именно - у тебя в текте будут повторять ся одни и те же операции после FindFirstFile и FindNextFile Я бы сделал как то так hfound=FindFirstFile(...) while( hfound ) { . . . // работа с найденным файлом hfound=FindNextFile(...) } -------------------- Cpu not found ! Press any key for software emulation. |
|||
|
||||
VIAL |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 5.7.2005 Репутация: нет Всего: нет |
Спасибо. Поправим.
|
|||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Оптимизировать поиск можно, но поиск В БАЗЕ!! Я так понимаю, база будет большая, не 10 элементов. Организуй ее как std::set - поиск в этом контейнере проходит за логарифмическое время.
И используй вместо обычных вызовов - системные. Типа open, close. Так точно быстрее пойдет. |
|||
|
||||
vadims |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 305 Регистрация: 8.6.2005 Репутация: 2 Всего: 17 |
comcon1 В смысле в базе - не вьехал какую базу ты имеешь в виду ??? Предлагаешь копию структуры файлов-каталогов делать - а обновлять как ?? Или что ???
-------------------- Cpu not found ! Press any key for software emulation. |
|||
|
||||
comcon1 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 11.6.2005 Где: Москва ДАС-МГУ Репутация: 12 Всего: 17 |
Ну он вычисленную контр. сумму ищет в своей базе данных - в массиве каком-то из 10 элементов.
Но, я так понимаю, это заглушка, а в реал-проге этот массив будет скачиваться из файла и будет большим. И поиск вычисленной контрсуммы в нем надо проводить биарный, а не переборный. Я это имел в виду. Это сообщение отредактировал(а) comcon1 - 12.7.2005, 12:29 |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |