directory_entry与recursive_directory_iterator遍历目录
请介绍 std::filesystem::directory_entry 和 recursive_directory_iterator 的用法,如何高效遍历文件系统、过滤目录与文件、获取文件元信息(大小、时间、权限)。
回答
孤独的心
directory_entry:目录项封装,提供 path()、file_size()、last_write_time()、status()、is_regular_file() 等方法。
遍历目录:
#include <filesystem>
namespace fs = std::filesystem;
// 非递归遍历
for (const auto& entry : fs::directory_iterator("/path")) {
if (entry.is_regular_file()) {
auto size = entry.file_size();
auto time = entry.last_write_time();
}
}
// 递归遍历
for (const auto& entry : fs::recursive_directory_iterator("/path")) {
if (entry.is_directory()) {
entry.disable_recursion_pending(); // 跳过该子目录
}
}
过滤选项:
directory_iterator(path, directory_options::skip_permission_denied)跳过无权限目录。recursive_directory_iterator的depth()方法获取递归深度。
符号链接:is_symlink() 判断,read_symlink() 读取目标。使用 canonical() 或 weakly_canonical() 解析。
文件时间:file_time_type 转 time_t:
auto ftime = entry.last_write_time();
auto cftime = clock::to_time_t(ftime);