std::experimental::filesystem::recursive_directory_iterator
来自cppreference.com
< cpp | experimental | fs
在标头 <experimental/filesystem> 定义
|
||
class recursive_directory_iterator; |
(文件系统 TS) | |
recursive_directory_iterator
是一种老式输入迭代器 (LegacyInputIterator) ,它在某个目录的 directory_entry 元素上,以及递归地在其所有子目录的目录项上迭代。未指定迭代顺序,但每个目录项仅被访问一次。
默认情况,并不跟随符号链接,但可以在构造时通过指定目录选项 follow_directory_symlink 来启用之。
特殊路径名 点 和 点点 被跳过。
如果 recursive_directory_iterator
推进到越过顶层目录的最末目录项,则它变为等于默认构造的迭代器,亦称为尾迭代器。两个尾迭代器总是相等,解引用或增加尾迭代器为未定义行为。
如果在已经创建递归目录迭代器之后有文件或目录被删除或加入目录树,则未指明是否能通过该迭代器观察到此变化。
如果目录结构中包含循环,则可能无法抵达尾迭代器。
成员类型
成员类型 | 定义 |
value_type
|
filesystem::directory_entry
|
difference_type
|
std::ptrdiff_t
|
pointer
|
const filesystem::directory_entry*
|
reference
|
const filesystem::directory_entry&
|
iterator_category
|
std::input_iterator_tag
|
成员函数
构造递归目录迭代器 (公开成员函数) | |
(析构函数) |
预置的析构函数 (公开成员函数) |
观察器 | |
访问所指向的目录项 (公开成员函数) | |
访问当前活跃的影响遍历的选项 (公开成员函数) | |
返回当前递归深度 (公开成员函数) | |
检查是否对当前目录禁用了递归 (公开成员函数) | |
修改器 | |
访问内容 (公开成员函数) | |
推进到下一个目录项 (公开成员函数) | |
在目录层次中向上移动一层迭代器 (公开成员函数) | |
禁用递归知道下一次自增 (公开成员函数) |
非成员函数
支持基于范围的 for 循环 (函数) |
此外,还提供了 operator==
和 operator!=
,既为成员也为非成员,此为 老式输入迭代器 (LegacyInputIterator) 的规定。
注解
recursive_directory_iterator
通常持有指向实现定义对象的引用计数指针(以满足 老式输入迭代器 (LegacyInputIterator) 的浅复制语义),该对象持有:
- 一个存储非递归的 directory_iterator 的容器(如 std::vector),构成递归栈。
- 递归深度计数器(可由 depth() 访问)。
- 构造时所用的目录选项(可由 options() 访问)。
- 待定递归标记(可由 recursion_pending() 访问,可能与目录选项合并以节省空间)。
示例
运行此代码
#include <experimental/filesystem> #include <fstream> #include <iostream> namespace fs = std::experimental::filesystem; int main() { fs::create_directories("sandbox/a/b"); std::ofstream("sandbox/file1.txt"); fs::create_symlink("a", "sandbox/syma"); for (const fs::directory_entry& entry : fs::recursive_directory_iterator("sandbox")) std::cout << entry << '\n'; fs::remove_all("sandbox"); }
可能的输出:
"sandbox/a" "sandbox/a/b" "sandbox/file1.txt" "sandbox/syma"
参阅
指向目录内容的迭代器 (类) | |
目录条目 (类) | |
用于迭代目录内容的选项 (枚举) |