std::filesystem:: recursive_directory_iterator
|
Определено в заголовке
<filesystem>
|
||
|
class
recursive_directory_iterator
;
|
(начиная с C++17) | |
recursive_directory_iterator
является
LegacyInputIterator
, который выполняет итерацию по элементам
directory_entry
директории и, рекурсивно, по записям всех поддиректорий. Порядок итерации не определён, за исключением того, что каждая запись директории посещается только один раз.
По умолчанию символические ссылки не отслеживаются, но это можно включить, указав параметр директории follow_directory_symlink во время создания.
Специальные имена путей dot и dot-dot пропускаются.
Если
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 |
Функции-члены
|
создает рекурсивный итератор директорий
(public member function) |
|
|
(destructor)
|
деструктор по умолчанию
(public member function) |
Наблюдатели |
|
|
предоставляет доступ к текущему элементу
(public member function) |
|
|
возвращает текущие активные опции, влияющие на итерацию
(public member function) |
|
|
возвращает текущую глубину рекурсии
(public member function) |
|
|
проверяет, отключена ли рекурсия для текущей директории
(public member function) |
|
Модификаторы |
|
|
присваивает содержимое
(public member function) |
|
|
переходит к следующему элементу
(public member function) |
|
|
перемещает итератор на один уровень вверх в иерархии директорий
(public member function) |
|
|
отключает рекурсию до следующего инкремента
(public member function) |
|
Функции, не являющиеся членами класса
|
поддержка range-based for loop
(функция) |
Кроме того,
operator==
и
operator!=
предоставляются
(до C++20)
operator==
предоставляется
(начиная с C++20)
в соответствии с требованиями
LegacyInputIterator
.
Не указано,
предоставляется ли
operator!=
, поскольку он может быть синтезирован из
operator==
, и
(начиная с C++20)
является ли оператор равенства членом класса или внешней функцией.
Вспомогательные специализации
|
template
<>
constexpr
bool
|
(начиная с C++20) | |
|
template
<>
constexpr
bool
|
(начиная с C++20) | |
Эти специализации для
recursive_directory_iterator
делают его
borrowed_range
и
view
.
Примечания
Обычно
recursive_directory_iterator
содержит подсчитываемую по ссылкам
указатель
(для обеспечения семантики поверхностного копирования
LegacyInputIterator
) на объект реализации, который содержит:
- контейнер (например, std::vector ) нерекурсивных directory_iterator s , формирующий стек рекурсии,
- счётчик глубины рекурсии (доступный через 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"); // Явная итерация по элементам std::filesystem::directory_entry 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'; // Итерация по элементам std::filesystem::directory_entry с использованием `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 | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 3480 | C++20 |
recursive_directory_iterator
was neither a
borrowed_range
nor a
view
|
it is both |
Смотрите также
|
(C++17)
|
итератор содержимого директории
(класс) |
|
(C++17)
|
запись директории
(класс) |
|
(C++17)
|
опции для итерации содержимого директории
(перечисление) |