Класс 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,
которая проверяет, является ли путь директорией