std::filesystem:: directory_iterator
|
定义于头文件
<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
|
(自 C++20 起) | |
|
template
<>
constexpr
bool
|
(自 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
|
两者皆是 |
参见
|
(C++17)
|
用于遍历目录及其子目录内容的迭代器
(类) |
|
(C++17)
|
用于目录遍历的选项
(枚举) |
|
(C++17)
|
目录条目
(类) |