Страницы

Поиск по вопросам

пятница, 7 июня 2019 г.

Как сделать рекурсивный поиск по файлам только определенного расширения?

void getFiles(const string& inpath, string outpath) { string mask = inpath + "\\*"; WIN32_FIND_DATA FindFileData; HANDLE hf; hf = FindFirstFile(mask.c_str(), &FindFileData);
ofstream output; output.open(outpath + "\\data.txt", ios_base::app);
if (hf != INVALID_HANDLE_VALUE) { do { if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (strcmp(FindFileData.cFileName, ".") == 0 || strcmp(FindFileData.cFileName, "..") == 0) continue; getFiles(inpath + "\\" + FindFileData.cFileName, outpath); } else output << inpath << "\\" << FindFileData.cFileName << endl;
} while (FindNextFile(hf, &FindFileData) != 0); FindClose(hf); }
output.close(); }
Есть такая функция, которая ищет файлы в выбранном каталоге и его подкаталогах, а потом записывает пути к файлам в data.txt. А как мне сделать так, чтобы эта функция искала только файлы с определенным расширением, например, .xml?


Ответ

Вызов поиска файлов несколько раз с разными расширениями - неверная концепция. Работа с таблицей файлов (на диске) медленнее, чем обработка строк.
Поэтому соберите все расширения в хэш-таблицу, список, массив или даже в одну строку, просканируйте файлы единожды с универсальной маской *. Для каждого найденного файла выделите его расширение и проверьте, есть ли оно в выбранной структуре, хранящей нужные расширения.

Комментариев нет:

Отправить комментарий