Иногда нужно быстро пройтись по папке и выбрать только нужные файлы. Например, найти все .log, .json, .txt или .cpp файлы для дальнейшей обработки.
Для этого удобно использовать std::filesystem. Он даёт нормальные типы для путей, директорий и файлов без ручной склейки строк.
Сначала зададим директорию и нужное расширение:
namespace fs = std::filesystem;
fs::path root = "logs";
std::string ext = ".log";
Теперь можно пройти по директории рекурсивно:
for (const auto& entry : fs::recursive_directory_iterator(root)) {
// проверяем каждый элемент
}Важно не обрабатывать директории как файлы. Поэтому сначала проверяем тип элемента:
if (!entry.is_regular_file()) {
continue;
}После этого сравниваем расширение через path::extension:
if (entry.path().extension() == ext) {
std::cout << entry.path() << "\n";
}Такой код не зависит от ручного поиска точки в имени файла. Если путь содержит несколько точек или вложенные папки, filesystem всё равно корректно выделит расширение.
Можно легко заменить действие внутри if. Вместо вывода в консоль файл можно прочитать, добавить в список, посчитать размер или передать в другую функцию.


