Namespaces
Variants

std::filesystem:: recursive_directory_iterator

From cppreference.net
定义于头文件 <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

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_range view

注释

一个 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 它两者都是

参见

目录内容的迭代器
(类)
目录项
(类)
目录内容迭代选项
(枚举)