std::filesystem::recursive_directory_iterator

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

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

默认不跟随符号链接,但这可以通过在构造时指定目录选项 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 循环支持
(函数) [编辑]

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

是否提供 operator!=(因为它能从 operator== 合成),以及(C++20 起)相等运算符是成员还是非成员是未指定的。

[编辑] 辅助特化

template<>

constexpr bool

    ranges::enable_borrowed_range<std::filesystem::recursive_directory_iterator> = true;
(C++20 起)
template<>

constexpr bool

    ranges::enable_view<std::filesystem::recursive_directory_iterator> = true;
(C++20 起)

这些对 recursive_directory_iterator 的特化使之为 borrowed_rangeview

[编辑] 注解

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

[编辑] 示例

#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 它都是

[编辑] 参阅

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