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

144
03 октября 2018, 07:00
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?

Answer 1

Вызов поиска файлов несколько раз с разными расширениями - неверная концепция. Работа с таблицей файлов (на диске) медленнее, чем обработка строк.

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

READ ALSO
Как задать директорию С++

Как задать директорию С++

Мне нужно взаимодействовать с файлом paroli_ot_vk_druzeitxt

182
Что быстрее? cin&gt;&gt;buff или read(0,buff,size)

Что быстрее? cin>>buff или read(0,buff,size)

Сказано, что read это системный вызов, и его преимущество перед функциями из других библиотек, в том, что по определению системный вызов должен...

160
Макрос-функция в С++

Макрос-функция в С++

Функция должна сравнивать параметры x и y и присваивать r значение большегоКак можно её реализовать так, чтобы всё не ломалось при передаче...

167
Code::Blocks - GDB не видит точек останова в проекте CMake

Code::Blocks - GDB не видит точек останова в проекте CMake

Продолжая знакомиться с Code::Blocks наткнулся на непонятное поведениеЕсли проект создан с помощью CMake - GDB не видит точек останова в проекте, так...

151