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 |
[编辑] 成员函数
构造目录迭代器 (公共成员函数) | |
(析构函数) |
默认析构函数 (公共成员函数) |
分配内容 (公共成员函数) | |
访问指向的条目 (公共成员函数) | |
前进到下一个条目 (公共成员函数) |
[编辑] 非成员函数
基于范围的 for 循环支持 (函数) |
此外,operator==
和 operator!=
是(直到 C++20)operator==
是(自 C++20 起)根据 LegacyInputIterator 提供的。
是否提供相等运算符是未指定的 ,因为可以从 operator==
合成它,并且(自 C++20 起)相等运算符是成员还是非成员。
[编辑] 辅助模板
namespace std::ranges { template<> |
(自 C++20 起) | |
namespace std::ranges { template<> |
(自 C++20 起) | |
这些针对 directory_iterator
的特化使其成为一个 borrowed_range
和一个 view
。
[编辑] 备注
许多用于目录遍历的底层操作系统 API 除了下一个目录条目外,还会检索文件属性。 std::filesystem::directory_iterator 的构造函数和非 const 成员函数将这些属性(如果有)存储在指向的 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 can be iterated using a range-for loop 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 behaves as a range in other ways, too 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'; // delete the sandbox dir and all contents within it, including subdirs 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++ 标准。
DR | 应用于 | 已发布的行为 | 正确行为 |
---|---|---|---|
LWG 3480 | C++20 | directory_iterator 既不是一个 borrowed_range ,也不是一个 view |
它两者都是 |
[编辑] 参见
(C++17) |
一个指向目录及其子目录内容的迭代器 (类) |
(C++17) |
用于迭代目录内容的选项 (枚举) |
(C++17) |
目录项 (类) |