std::filesystem::recursive_directory_iterator

来自cppreference.com
 
 
 
 
在标头 <filesystem> 定义
class recursive_directory_iterator;
(C++17 起)

recursive_directory_iterator 是在目录的 directory_entry 元素上,及递归地在所有子目录的目录条目上迭代的老式输入迭代器 (LegacyInputIterator) 。迭代顺序是未指定的,除了只造访一次每个目录条目。

默认不跟随符号链接,但这可以通过在构造时指定目录选项 follow_directory_symlink 启用。

跳过特殊路径名 dotdot-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

成员函数

构造递归目录迭代器
(公开成员函数)
(析构函数)
默认析构函数
(公开成员函数)
观察器
访问所指的目录条目
(公开成员函数)
返回影响迭代的当前活跃选项
(公开成员函数)
返回当前递归深度
(公开成员函数)
检查对当前目录是否禁用递归
(公开成员函数)
修改器
对内容赋值
(公开成员函数)
前移到下个目录条目
(公开成员函数)
在目录层级中将迭代器上移一层
(公开成员函数)
在下次自增前禁用递归
(公开成员函数)

非成员函数

基于范围的 for 循环支持
(函数)

另外按老式输入迭代器 (LegacyInputIterator) 所要求提供 operator==operator!= (C++20 前)operator== (C++20 起)

是否提供 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_rangeview

注解

recursive_directory_iterator 通常保有指向实现对象的引用计数指针(以满足老式输入迭代器 (LegacyInputIterator) 的浅复制语义),该对象保有:

示例

#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
 
int main()
{
    fs::create_directories("sandbox/a/b");
    std::ofstream("sandbox/file1.txt");
    fs::create_symlink("a", "sandbox/syma");
    for(auto& p: fs::recursive_directory_iterator("sandbox"))
        std::cout << p.path() << '\n';
    fs::remove_all("sandbox");
}

可能的输出:

"sandbox/a"
"sandbox/a/b"
"sandbox/file1.txt"
"sandbox/syma"

缺陷报告

下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。

缺陷报告 应用于 出版时的行为 正确行为
LWG 3480 C++20 recursive_directory_iterator 既非 borrowed_range 亦非 view 它都是

参阅

指向目录内容的迭代器
(类)
目录条目
(类)
用于迭代目录内容的选项
(枚举)