Быстрый поиск файлов

Тема в разделе "WASM.BEGINNERS", создана пользователем rzx, 19 ноя 2008.

  1. rzx

    rzx New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2008
    Сообщения:
    7
    Я тут написал процедуру, которая в указанной директории ищет файлы. Есть возможность поиска в поддиректориях.
    Процедура кидает в два вектора (которые ей передаются в аргументах) просто файлы и архивы. Но перед этим они проходят некоторую проверку, но это не важно.
    Так вот... Можно как-нибудь оптимизировать мой вариант поиска? Нужно чтобы поиск проходил быстро-быстро.
    Вот, например, как антивирус Касперского сканирует директорию? Ведь он очень быстро строит список файлов, т.к. отображает процесс сканирования на progressbar'e... или он каким-то образом сначала получает кол-во файлов в директории, а потом по ходу поиска файлов проверяет их?
    В общем, помогите с оптимизацией, или какой-нибудь другой вариант реализации предложите.
    Спасибо.

    Вот процедура:
    Код (Text):
    1. #include <string>
    2. #include <io.h>
    3. usign namespace std;
    4.  
    5. ...
    6.  
    7. void findFiles(string _rootDirectory, list <string> *_files,
    8.                   list <string> *_archives)
    9. {
    10.  _finddata_t FileInfo;
    11.  unsigned int FileHandle;
    12.  string rootDir = _rootDirectory;
    13.  rootDir += "\\*.*";
    14.  if((FileHandle = _findfirst((char *)rootDir.c_str(), &FileInfo)) != INVALID_HANDLE_VALUE)
    15.  {
    16.   do
    17.   {
    18.        if(strcmp(FileInfo.name, ".") != 0 && strcmp(FileInfo.name, "..") != 0)
    19.        {
    20.          // Если это не поддиректория
    21.         if(!(FileInfo.attrib & _A_SUBDIR))
    22.         {
    23.            // Сначала проверяем не архив ли это...
    24.           if(isArchive(FileInfo.name))
    25.             Archives->push_back(FileInfo.name);
    26.          else // Если не архив, то проверяем подходит ли файл под условия
    27.             if(isSuitable(FileInfo.name, FileInfo.size))
    28.                Files->push_back(FileInfo.name);
    29.          }
    30.          else // Поддиректория
    31.         {
    32.          string subdir;
    33.          int i = rootDir.findFirst('*');
    34.          subdir = rootDir.substr(0, i-1);
    35.          subdir = subdir + "\\" + FileInfo.name;
    36.          FindFiles(subdir, _files, _archives);
    37.          }
    38.          }
    39.   }
    40.   while(_findnext(FileHandle, &FileInfo) == 0);
    41.  
    42.  }
    43.  // Завершаем поиск
    44.  _findclose(
    isArchive, isSuitable - простые процедуры определения подходит ли файл под свойства архивов или простых файлов.
     
  2. SadKo

    SadKo Владимир Садовников

    Публикаций:
    8
    Регистрация:
    4 июн 2007
    Сообщения:
    1.610
    Адрес:
    г. Санкт-Петербург
    У меня есть предположение, что для быстрого поиска следует делать многоуровневый хэш (см. map, hash_map), а для актуализации хэша (удаление/добавление элементов) сделать ловушки на создание/удаление файлов, что возможно в режиме ядра. При старте системы производить фоновое сканирование и держать многоуровневый хэш в памяти.
     
  3. Dian

    Dian Member

    Публикаций:
    0
    Регистрация:
    19 июн 2008
    Сообщения:
    222
    SadKo
    По идее это работа драйвера ФС. Интересно, сколько памяти будет жрать этот хэш?