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 |
成员函数
|
构造递归目录迭代器
(公开成员函数) |
|
|
(destructor)
|
默认析构函数
(公开成员函数) |
观察器 |
|
|
访问指向的条目
(公开成员函数) |
|
|
返回当前影响迭代的活跃选项
(公开成员函数) |
|
|
返回当前递归深度
(公开成员函数) |
|
|
检查当前目录的递归是否被禁用
(公开成员函数) |
|
修改器 |
|
|
赋值内容
(公开成员函数) |
|
|
前进到下一个条目
(公开成员函数) |
|
|
将迭代器在目录层次结构中上移一级
(公开成员函数) |
|
|
禁用递归直到下一次递增
(公开成员函数) |
|
非成员函数
|
基于范围的 for 循环支持
(函数) |
此外,
operator==
和
operator!=
被
(C++20 前)
operator==
被
(C++20 起)
根据
LegacyInputIterator
的要求提供。
未指定
是否提供
operator!=
,因为它可以通过
operator==
合成,且
(C++20 起)
相等运算符是成员函数还是非成员函数。
Helper specializations
|
template
<>
constexpr
bool
|
(自 C++20 起) | |
|
template
<>
constexpr
bool
|
(自 C++20 起) | |
这些针对
recursive_directory_iterator
的特化使其成为
borrowed_range
和
view
。
注释
一个
recursive_directory_iterator
通常持有一个引用计数的
指针
(用于满足
LegacyInputIterator
的浅拷贝语义),该指针指向一个实现对象,该对象包含:
- 构成递归栈的非递归 directory_iterator s 容器(例如 std::vector ),
- 可通过 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'; // 使用 `auto` 迭代 std::filesystem::directory_entry 元素 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)
|
目录内容迭代选项
(枚举) |