Namespaces
Variants

std::filesystem:: directory_iterator

From cppreference.net
定义于头文件 <filesystem>
class directory_iterator ;
(C++17 起)

directory_iterator 是一种 LegacyInputIterator ,用于遍历目录中的 directory_entry 元素(但不会访问子目录)。迭代顺序未指定,但确保每个目录条目仅被访问一次。特殊路径名 dot dot-dot 会被跳过。

如果 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== 合成,且 (since C++20) 相等运算符是成员函数还是非成员函数。

辅助特化

template <>

constexpr bool

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

constexpr bool

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

这些针对 directory_iterator 的特化使其成为 borrowed_range view

注释

许多用于目录遍历的底层操作系统API会在获取下一个目录项时同时检索文件属性。 std::filesystem::directory_iterator 的构造函数及非常量成员函数会将这些属性(如果存在)存储到所指向的 std::filesystem::directory_entry 对象中,而无需调用 directory_entry::refresh ,这使得在遍历目录项时能够直接检查其属性,无需进行额外的系统调用。

示例

#include <algorithm>
#include <filesystem>
#include <fstream>
#include <iostream>
int main()
{
    const std::filesystem::path sandbox{"sandbox"};
    std::filesystem::create_directories(sandbox/"dir1"/"dir2");
    std::ofstream{sandbox/"file1.txt"};
    std::ofstream{sandbox/"file2.txt"};
    std::cout << "directory_iterator:\n";
    // directory_iterator 可通过范围 for 循环进行迭代
    for (auto const& dir_entry : std::filesystem::directory_iterator{sandbox}) 
        std::cout << dir_entry.path() << '\n';
    std::cout << "\ndirectory_iterator as a range:\n";
    // directory_iterator 在其他方面也表现为一个范围
    std::ranges::for_each(
        std::filesystem::directory_iterator{sandbox},
        [](const auto& dir_entry) { std::cout << dir_entry << '\n'; });
    std::cout << "\nrecursive_directory_iterator:\n";
    for (auto const& dir_entry : std::filesystem::recursive_directory_iterator{sandbox}) 
        std::cout << dir_entry << '\n';
    // 删除沙盒目录及其所有内容,包括子目录
    std::filesystem::remove_all(sandbox);
}

可能的输出:

directory_iterator:
"sandbox/file2.txt"
"sandbox/file1.txt"
"sandbox/dir1"
directory_iterator as a range:
"sandbox/file2.txt"
"sandbox/file1.txt"
"sandbox/dir1"
recursive_directory_iterator:
"sandbox/file2.txt"
"sandbox/file1.txt"
"sandbox/dir1"
"sandbox/dir1/dir2"

缺陷报告

以下行为变更缺陷报告被追溯应用于先前发布的C++标准。

缺陷报告 应用于 发布时行为 正确行为
LWG 3480 C++20 directory_iterator 既不是 borrowed_range 也不是 view 两者皆是

参见

用于遍历目录及其子目录内容的迭代器
(类)
用于目录遍历的选项
(枚举)
目录条目
(类)