Spec-Zone.ru › C++

std::filesystem::recursive_directory_iterator

Определено в заголовке <filesystem>
class recursive_directory_iterator;
(с C++17)

recursive_directory_iterator является LegacyInputIterator, который итерирует элементы directory_entry каталога и, рекурсивно, элементы всех подкаталогов. Порядок итерации не определён, за исключением того, что каждая запись каталога посещается только один раз.

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

Специальные имена путей точка и точка-точка пропускаются.

Если recursive_directory_iterator сообщает об ошибке или переходит за последнюю запись каталога в каталоге верхнего уровня, он становится равным итератору по умолчанию, также известному как итератор конца. Два итератора конца всегда равны, обращение к итератору конца или инкрементирование его является неопределённым поведением.

Если файл или каталог удаляются или добавляются в дерево каталогов после создания итератора рекурсивного каталога, не определено, будет ли изменение наблюдаться через итератор.

Если структура каталогов содержит циклы, итератор конца может быть недостижим.

Типы членов

Тип члена Определение
value_type std::filesystem::directory_entry
difference_type std::ptrdiff_t
pointer const std::filesystem::directory_entry*
reference const std::filesystem::directory_entry&
iterator_category std::input_iterator_tag

Члены-функции

(конструктор)
создаёт итератор рекурсивного каталога
(публичный член-функция)
(деструктор)
деструктор по умолчанию
(публичный член-функция)
Наблюдатели
operator*operator->
обращается к указанной записи
(публичный член-функция)
options
возвращает текущие активные опции, влияющие на итерацию
(публичный член-функция)
depth
возвращает текущую глубину рекурсии
(публичный член-функция)
recursion_pending
проверяет, отключена ли рекурсия для текущего каталога
(публичный член-функция)
Модификаторы
operator=
присваивает содержимое
(публичный член-функция)
incrementoperator++
переходит к следующей записи
(публичный член-функция)
pop
перемещает итератор на один уровень вверх в иерархии каталогов
(публичный член-функция)
disable_recursion_pending
отключает рекурсию до следующего инкрементирования
(публичный член-функция)

Функции, не являющиеся членами

begin(std::filesystem::recursive_directory_iterator)end(std::filesystem::recursive_directory_iterator)
поддержка циклов for с диапазоном
(функция)

operator== и operator!= —(до C++20)operator== —(с C++20) предоставляется в соответствии с требованиями LegacyInputIterator.

Не определено, предоставляется ли operator!=, так как он может быть синтезирован из operator==, и(с C++20) является ли оператор равенства членом или не членом.

Вспомогательные шаблоны

namespace std::ranges {
template<>
inline constexpr bool
    enable_borrowed_range<std::filesystem::recursive_directory_iterator> = true;
}
(с C++20)
namespace std::ranges {
template<>
inline constexpr bool
    enable_view<std::filesystem::recursive_directory_iterator> = true;
}
(с C++20)

Эти специализации для recursive_directory_iterator делают его borrowed_range и view.

Примечания

recursive_directory_iterator обычно содержит указатель со счётом ссылок (для удовлетворения семантики поверхностного копирования LegacyInputIterator) на объект реализации, который содержит:

  • контейнер (например, std::vector) нерекурсивных directory_iterator, который образует стек рекурсии,
  • счётчик глубины рекурсии (доступен с помощью depth()),
  • опции каталога, используемые при создании (доступны с помощью options()),
  • флаг ожидаемой рекурсии (доступен с помощью recursion_pending(), может быть объединён с опциями каталога для экономии места).

Пример

#include <filesystem>
#include <fstream>
#include <iostream>
#include <string>
namespace fs = std::filesystem;
 
int main()
{
    std::filesystem::current_path(std::filesystem::temp_directory_path());
    std::filesystem::create_directories("sandbox/a/b");
    std::ofstream("sandbox/file1.txt");
    std::filesystem::create_symlink("a", "sandbox/syma");
 
    // Iterate over the std::filesystem::directory_entry elements explicitly
    auto entry_length{3UZ};
    for (const fs::directory_entry& dir_entry :
            fs::recursive_directory_iterator("sandbox"))
    {
        std::cout << dir_entry << '\n';
        if (auto l{dir_entry.path().string().length()}; entry_length < l)
            entry_length = l;
    }
    std::cout << std::string(entry_length + 2, '-') << '\n';
 
    // Iterate over the std::filesystem::directory_entry elements using `auto`
    for (auto const& dir_entry : fs::recursive_directory_iterator("sandbox"))
        std::cout << dir_entry << '\n';
 
    std::filesystem::remove_all("sandbox");
}

Возможный вывод:

"sandbox/syma"
"sandbox/file1.txt"
"sandbox/a"
"sandbox/a/b"
-------------------
"sandbox/syma"
"sandbox/file1.txt"
"sandbox/a"
"sandbox/a/b"

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применён к Поведение, как опубликовано Корректное поведение
LWG 3480 C++20 recursive_directory_iterator не являлся borrowed_range ни view он является и тем, и другим

См. также

directory_iterator
(C++17)
итератор содержимого каталога
(класс)
directory_entry
(C++17)
запись каталога
(класс)
directory_options
(C++17)
опции для итерирования содержимого каталога
(перечисление)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/filesystem/recursive_directory_iterator

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API