РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
518 of 815 menu

Класс recursive_directory_iterator

Класс recursive_directory_iterator из заголовка <filesystem> предназначен для рекурсивного обхода директорий. В отличие от directory_iterator, который перебирает только элементы одной директории, recursive_directory_iterator автоматически заходит во все вложенные поддиректории. Первым параметром конструктор принимает путь к директории, вторым - опциональные флаги directory_options (например, skip_permission_denied для пропуска директорий без прав доступа), а третьим - объект error_code для получения информации об ошибке. Каждый элемент итератора имеет тип directory_entry и содержит путь, который можно получить методом path.

Синтаксис

#include <filesystem> namespace fs = std::filesystem; fs::recursive_directory_iterator it(path); fs::recursive_directory_iterator it(path, options); fs::recursive_directory_iterator it(path, options, ec); fs::recursive_directory_iterator it(path, ec); fs::recursive_directory_iterator begin(path); fs::recursive_directory_iterator end;

Пример

Давайте рекурсивно обойдём директорию /var/www и выведем пути всех найденных элементов:

#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; int main() { fs::recursive_directory_iterator it("/var/www"); fs::recursive_directory_iterator end; for (; it != end; ++it) { cout << it->path().string() << endl; } return 0; }

Результат выполнения кода:

"/var/www/index.html" "/var/www/css" "/var/www/css/style.css" "/var/www/js" "/var/www/js/script.js"

Пример

Давайте воспользуемся range-based циклом for для более компактного обхода директории /var/www:

#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; int main() { for (const auto& entry : fs::recursive_directory_iterator("/var/www")) { cout << entry.path().string() << endl; } return 0; }

Результат выполнения кода:

"/var/www/index.html" "/var/www/css" "/var/www/css/style.css" "/var/www/js" "/var/www/js/script.js"

Пример

Давайте выведем только те элементы, которые являются обычными файлами, пропустив директории:

#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; int main() { for (const auto& entry : fs::recursive_directory_iterator("/var/www")) { if (entry.is_regular_file()) { cout << entry.path().string() << endl; } } return 0; }

Результат выполнения кода:

"/var/www/index.html" "/var/www/css/style.css" "/var/www/js/script.js"

Пример

Давайте используем метод disable_recursion_pending, чтобы не заходить в поддиректорию /var/www/js:

#include <iostream> #include <filesystem> using namespace std; namespace fs = std::filesystem; int main() { for (auto it = fs::recursive_directory_iterator("/var/www"); it != fs::recursive_directory_iterator(); ++it) { cout << it->path().string() << endl; if (it->path().filename() == "js") { it.disable_recursion_pending(); } } return 0; }

Результат выполнения кода:

"/var/www/index.html" "/var/www/css" "/var/www/css/style.css" "/var/www/js"

Смотрите также

  • класс directory_iterator,
    который перебирает элементы одной директории
  • класс path,
    который представляет путь к файлу или директории
  • класс directory_entry,
    который представляет элемент директории
  • функция is_directory,
    которая проверяет, является ли путь директорией
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить