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 |
Члены-функции
| создаёт итератор рекурсивного каталога (публичный член-функция) |
|
| (деструктор) | деструктор по умолчанию (публичный член-функция) |
Наблюдатели |
|
| обращается к указанной записи (публичный член-функция) |
|
| возвращает текущие активные опции, влияющие на итерацию (публичный член-функция) |
|
| возвращает текущую глубину рекурсии (публичный член-функция) |
|
| проверяет, отключена ли рекурсия для текущего каталога (публичный член-функция) |
|
Модификаторы |
|
| присваивает содержимое (публичный член-функция) |
|
| переходит к следующей записи (публичный член-функция) |
|
| перемещает итератор на один уровень вверх в иерархии каталогов (публичный член-функция) |
|
| отключает рекурсию до следующего инкрементирования (публичный член-функция) |
|
Функции, не являющиеся членами
| поддержка циклов 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 | он является и тем, и другим |
См. также
|
(C++17) | итератор содержимого каталога (класс) |
|
(C++17) | запись каталога (класс) |
|
(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