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 | conststd::filesystem::directory_entry* |
reference | conststd::filesystem::directory_entry& |
iterator_category |
std::input_iterator_tag |
Функции-члены
| создаёт рекурсивный итератор каталога (функция-член общего доступа) |
|
|
(destructor) | деструктор по умолчанию (функция-член общего доступа) |
Наблюдатели |
|
| обращается к записи, на которую указывает итератор (функция-член общего доступа) |
|
| возвращает текущие активные параметры, влияющие на итерацию (функция-член общего доступа) |
|
| возвращает текущую глубину рекурсии (функция-член общего доступа) |
|
| проверяет, отключена ли рекурсия для текущего каталога (функция-член общего доступа) |
|
Модификаторы |
|
| присваивает содержимое (функция-член общего доступа) |
|
| переходит к следующей записи (функция-член общего доступа) |
|
| перемещает итератор на один уровень вверх по иерархии каталогов (функция-член общего доступа) |
|
| отключает рекурсию до следующего инкремента (функция-член общего доступа) |
|
Функции, не являющиеся членами
|
(C++17) | поддержка цикла for на основе диапазона (функция) |
Кроме того, operator== и operator!= предоставляются(до C++20)operator== предоставляется(начиная с C++20) в соответствии с требованиями LegacyInputIterator.
Не определено, предоставляется ли operator!=, поскольку его можно синтезировать из operator==, а также(начиная с C++20) является ли оператор равенства функцией-членом или функцией, не являющейся членом.
Вспомогательные специализации
template<>
constexpr bool
ranges::enable_borrowed_range<std::filesystem::recursive_directory_iterator> = true;
| (начиная с C++20) | |
template<>
constexpr bool
ranges::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++.
| Отчёт об ошибке | Применяется к | Поведение согласно опубликованной версии | Правильное поведение |
|---|---|---|---|
| LWG 3480 | C++20 |
recursive_directory_iterator не являлся ни borrowed_range, ни view | является и тем и другим |
См. также
|
(C++17) | итератор по содержимому каталога (класс) |
|
(C++17) | запись каталога (класс) |
|
(C++17) | параметры для итерации по содержимому каталога (перечисление) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/filesystem/recursive_directory_iterator