C++17 的 库提供跨平台目录遍历能力,核心是 std::filesystem::directory_iterator(遍历一级子项)和 recursive_directory_iterator(递归遍历)。
C++17 的 库提供了跨平台的目录遍历能力,无需依赖 Boost 或系统 API,核心是 std::filesystem::directory_iterator 和 std::filesystem::recursive_directory_iterator。
使用 directory_iterator 可以逐个访问指定路径下的一级文件和子目录(不递归):
示例代码:
#include#include namespace fs = std::filesystem; in t main() { for (const auto& entry : fs::directory_iterator("/path/to/dir")) { std::cout << entry.path().filename().string() << "\n"; // entry.is_regular_file(), entry.is_directory() 等可判断类型 } }
注意:directory_iterator 不保证顺序,如需排序,可先收集到 std::vector 再调用 std::sort。
用 recursive_directory_iterator 自动深入每一层子目录:
fs::directory_options::follow_directory_symlink
pop() 跳出当前层级(例如过滤掉某子树),配合 depth() 判断当前深度fs::filesystem_error(如权限不足),建议用 try-catch 包裹遍历中常需筛选,推荐方式:
entry.is_regular_file() 排除非普通文件(如目录、socket、设备文件)entry.path().extension() == ".txt" 检查扩展名(注意 extension() 返回 fs::path,比较时用 .string() 或直接 path 比较)entry.path().filename().string() 获取纯文件名做字符串匹配entry.path().string().find(...) 做路径匹配——易受路径分隔符或编码影响,应使用 fs::path 的成员函数(如 has_filename, parent_path)真实场景中必须考虑健壮性:
fs::exists(path) && fs::is_directory(path) 验证路径有效性const fs::filesystem_error& e,检查 e.code().value() 区分 ENOENT、EACCES 等错误recursive_directory_iterator 可能比 shell 命令慢,因每次 stat 系统调用开销;如仅需文件名,可考虑 fs::directory_entry::path() 而非立即调用 status()