Страницы

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

среда, 29 января 2020 г.

Список файлов в директории и ее поддиректориях

#cpp


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


Ответы

Ответ 1



FindNextFile. Не уверен, что подойдет, но что вот если воспользоваться этой функцией? Имя найденного файла можно выдернуть из структуры WIN32_FIND_DATA, примерно будет так: вызываем FindFirstFile, находим файл, а потом вызываем FindNextFile. void Copy(LPCTSTR szInDirName, LPCTSTR szOutDirName, bool flag = false) { WIN32_FIND_DATA ffd; HANDLE hFind; TCHAR szFind[MAX_PATH + 1]; TCHAR szInFileName[MAX_PATH + 1]; TCHAR szOutFileName[MAX_PATH + 1]; lstrcpy(szFind, szInDirName); // Ищем файлы с любым именем и расширением lstrcat(szFind, L"\\*.*"); hFind = FindFirstFile(szFind, &ffd); do { // Формируем полный путь (источник) lstrcpy(szInFileName, szInDirName); lstrcat(szInFileName, L"\\"); lstrcat(szInFileName, ffd.cFileName); // Формируем полный путь (результат) lstrcpy(szOutFileName, szOutDirName); lstrcat(szOutFileName, L"\\"); lstrcat(szOutFileName, ffd.cFileName); // Если flag == true, то копируем и папки if(flag) { if(ffd.dwFileAttributes & 0x00000010) { if(lstrcmp(ffd.cFileName, L".") == 0 || lstrcmp(ffd.cFileName, L"..") == 0) continue; CreateDirectory(szOutFileName, NULL); Copy(szInFileName, szOutFileName); } } // Иначе пропускаем папки else if(ffd.dwFileAttributes & 0x00000010) continue; CopyFile(szInFileName, szOutFileName, TRUE); } while(FindNextFile(hFind, &ffd)); FindClose(hFind); } Это пример, просто, ищет файлы в одной директории, подкаталоги, копирует во вторую. Конечно, это не так хорошо, как выше совет, но все таки работает.

Ответ 2



Есть библиотека boost::filesystem. В качестве примера программа выводит все файлы с расширением cpp в текущей директории: #include #include namespace fs = boost::filesystem; int main() { for (fs::recursive_directory_iterator it("./"), end; it != end; ++it) { if (it->path().extension() == ".cpp") { std::cout << *it << std::endl; } } return 0; }

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

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