Объект типаrecursive_directory_iterator предоставляет итератор для последовательностиdirectory_entry элементов, представляющих файлы в каталоге или в определяемом реализацией типе файла, подобном каталогу, и его подкаталогам.
namespace std::filesystem { class recursive_directory_iterator { public: using iterator_category = input_iterator_tag; using value_type = directory_entry; using difference_type = ptrdiff_t; using pointer = const directory_entry*; using reference = const directory_entry&; // [fs.rec.dir.itr.members], constructors and destructor recursive_directory_iterator() noexcept; explicit recursive_directory_iterator(const path& p); recursive_directory_iterator(const path& p, directory_options options); recursive_directory_iterator(const path& p, directory_options options, error_code& ec) noexcept; recursive_directory_iterator(const path& p, error_code& ec) noexcept; recursive_directory_iterator(const recursive_directory_iterator& rhs); recursive_directory_iterator(recursive_directory_iterator&& rhs) noexcept; ~recursive_directory_iterator(); // [fs.rec.dir.itr.members], observers directory_options options() const; int depth() const; bool recursion_pending() const; const directory_entry& operator*() const; const directory_entry* operator->() const; // [fs.rec.dir.itr.members], modifiers recursive_directory_iterator& operator=(const recursive_directory_iterator& rhs); recursive_directory_iterator& operator=(recursive_directory_iterator&& rhs) noexcept; recursive_directory_iterator& operator++(); recursive_directory_iterator& increment(error_code& ec) noexcept; void pop(); void pop(error_code& ec); void disable_recursion_pending(); // other members as required by [input.iterators], input iterators }; }
Вызовoptions,depth,recursion_pending, pop илиdisable_recursion_pending на итератора , который не разыменовываемое приводит к неопределенному поведению.
Поведение arecursive_directory_iterator такое же, как и для a,directory_iterator если не указано иное.
[ Note: Если структура каталогов, по которой выполняется итерация, содержит циклы, то конечный итератор может быть недоступен. ] — end note
recursive_directory_iterator() noexcept;
explicit recursive_directory_iterator(const path& p);
recursive_directory_iterator(const path& p, directory_options options);
recursive_directory_iterator(const path& p, directory_options options, error_code& ec) noexcept;
recursive_directory_iterator(const path& p, error_code& ec) noexcept;
Effects: Создает итератор, представляющий первую запись в каталоге, в которыйp разрешается, если есть; в противном случае - конечный итератор. Однако если
(options & directory_options::skip_permission_denied) != directory_options::none
и конструкция обнаруживает ошибку, указывающую, что в доступеp отказано, создает конечный итератор и не сообщает об ошибке.
Postconditions:options() == options для подписей с directory_options аргументом, иначеoptions() == directory_options::none.
Throws: Как указано в[fs.err.report].
[ Note: Для перебора текущего каталога используйтеrecursive_directory_iterator(".") вместоrecursive_directory_iterator(""). ] — end note
[ Note: По умолчаниюrecursive_directory_iterator не следует символическим ссылкам на каталоги. Чтобы следовать символическим ссылкам каталога, укажитеoptions как ] directory_options::follow_directory_symlink — end note
recursive_directory_iterator(const recursive_directory_iterator& rhs);
recursive_directory_iterator(recursive_directory_iterator&& rhs) noexcept;
Postconditions:options(),depth()Иrecursion_pending() имеет значение , которые rhs.options(),rhs.depth()и rhs.recursion_pending(), соответственно, имели перед вызовом функции.
recursive_directory_iterator& operator=(const recursive_directory_iterator& rhs);
recursive_directory_iterator& operator=(recursive_directory_iterator&& rhs) noexcept;
Postconditions:options(),depth()Иrecursion_pending() имеет значение , которыеrhs.options(), rhs.depth()иrhs.recursion_pending(), соответственно, имели перед вызовом функции.
directory_options options() const;
Returns: Значение аргумента, переданного конструктору для options параметра, если он присутствует, в противном случае directory_options::none.
int depth() const;
Returns: Текущая глубина просматриваемого дерева каталогов. [ Note: Начальный каталог - это глубина0, его непосредственные подкаталоги - это глубина1и так далее. ] — end note
bool recursion_pending() const;
Returns:true ifdisable_recursion_pending() не был вызван после предыдущей операции построения или приращения, в противном случаеfalse.
recursive_directory_iterator& operator++();
recursive_directory_iterator& increment(error_code& ec) noexcept;
Effects: Как указано для операции увеличения префикса Input iterators, за исключением того, что:
Если на текущей глубине больше нет записей, то еслиdepth() != 0 итерация по родительскому каталогу возобновляется; иначе*this = recursive_directory_iterator().
В противном случае, если
recursion_pending() && is_directory((*this)->status()) && (!is_symlink((*this)->symlink_status()) || (options() & directory_options::follow_directory_symlink) != directory_options::none)
то либо каталог(*this)->path() рекурсивно перебирается, либо, если
(options() & directory_options::skip_permission_denied) != directory_options::none
и возникает ошибка, указывающая на то, что в разрешении на доступ к каталогу(*this)->path() отказано, тогда каталог(*this)->path() обрабатывается как пустой каталог и об ошибках не сообщается.
Throws: Как указано в[fs.err.report].
void pop();
void pop(error_code& ec);
Effects: Еслиdepth() == 0установите*this вrecursive_directory_iterator(). В противном случае прекратите итерацию каталога, по которому в настоящее время выполняется итерация, и продолжите итерацию по родительскому каталогу.
Throws: Как указано в[fs.err.report].
void disable_recursion_pending();
Эти функции позволяют использоватьrecursive_directory_iterator операторы for на основе диапазона.
recursive_directory_iterator begin(recursive_directory_iterator iter) noexcept;
recursive_directory_iterator end(const recursive_directory_iterator&) noexcept;