Страницы

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

понедельник, 30 марта 2020 г.

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

#cpp #winapi #файловая_система


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?
    


Ответы

Ответ 1



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

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

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