Я тут написал процедуру, которая в указанной директории ищет файлы. Есть возможность поиска в поддиректориях. Процедура кидает в два вектора (которые ей передаются в аргументах) просто файлы и архивы. Но перед этим они проходят некоторую проверку, но это не важно. Так вот... Можно как-нибудь оптимизировать мой вариант поиска? Нужно чтобы поиск проходил быстро-быстро. Вот, например, как антивирус Касперского сканирует директорию? Ведь он очень быстро строит список файлов, т.к. отображает процесс сканирования на progressbar'e... или он каким-то образом сначала получает кол-во файлов в директории, а потом по ходу поиска файлов проверяет их? В общем, помогите с оптимизацией, или какой-нибудь другой вариант реализации предложите. Спасибо. Вот процедура: Код (Text): #include <string> #include <io.h> usign namespace std; ... void findFiles(string _rootDirectory, list <string> *_files, list <string> *_archives) { _finddata_t FileInfo; unsigned int FileHandle; string rootDir = _rootDirectory; rootDir += "\\*.*"; if((FileHandle = _findfirst((char *)rootDir.c_str(), &FileInfo)) != INVALID_HANDLE_VALUE) { do { if(strcmp(FileInfo.name, ".") != 0 && strcmp(FileInfo.name, "..") != 0) { // Если это не поддиректория if(!(FileInfo.attrib & _A_SUBDIR)) { // Сначала проверяем не архив ли это... if(isArchive(FileInfo.name)) Archives->push_back(FileInfo.name); else // Если не архив, то проверяем подходит ли файл под условия if(isSuitable(FileInfo.name, FileInfo.size)) Files->push_back(FileInfo.name); } else // Поддиректория { string subdir; int i = rootDir.findFirst('*'); subdir = rootDir.substr(0, i-1); subdir = subdir + "\\" + FileInfo.name; FindFiles(subdir, _files, _archives); } } } while(_findnext(FileHandle, &FileInfo) == 0); } // Завершаем поиск _findclose( isArchive, isSuitable - простые процедуры определения подходит ли файл под свойства архивов или простых файлов.
У меня есть предположение, что для быстрого поиска следует делать многоуровневый хэш (см. map, hash_map), а для актуализации хэша (удаление/добавление элементов) сделать ловушки на создание/удаление файлов, что возможно в режиме ядра. При старте системы производить фоновое сканирование и держать многоуровневый хэш в памяти.