std::filesystem 是 C++17 引入的跨平台文件系统操作标准库,提供 path 类型自动处理路径分隔符、status/exist 等函数统一判断文件状态、directory_iterator 支持高效目录遍历。
std::filesystem 是 C++17 引入的标准库模块,用于跨平台文件系统操作。它统一了 Windows、Linux、macOS 等系统下路径处理、文件判断、目录遍历、复制删除等常见需求,避免手动拼接路径或调用平台 API(如 stat、FindFirstFile)。
std::filesystem::path 是核心类型,自动适配不同系统的路径分隔符(/ 或 \),支持隐式转换和运算符重载。
std::string,不要硬写反斜杠("C:\\temp\\file.txt");用正斜杠或原始字符串更安全:fs::path p = "/home/user/data"; 或 fs::path p = R"(C:\temp\file.txt)";
/ 运算符(不是 +
):fs::path p = dir / "config.json" / "backup";,会自动处理分隔符和冗余符号(如 "/a//b/./c" → /a/b/c)fs::absolute(p);标准化路径:p.lexically_normal()(仅字符串规范化,不访问文件系统)通过 fs::status() 或 fs::exists() 等函数快速获取元信息,无需手动处理错误码。
fs::exists(p) 判断路径是否存在(含文件、目录、符号链接)fs::is_regular_file(p)、fs::is_directory(p)、fs::is_symlink(p) 分别判断类型fs::file_size(p) 获取文件字节大小(对目录抛出 filesystem_error)fs::filesystem_error),如需静默处理,改用带 fs::error_code& 参数的重载版本,例如:fs::exists(p, ec)
使用 fs::directory_iterator(非递归)和 fs::recursive_directory_iterator(递归)遍历子项,返回迭代器范围,可配合范围 for 使用。
for (const auto& entry : fs::directory_iterator("/tmp")) { std::cout
for (const auto& entry : fs::recursive_directory_iterator("/usr", fs::directory_options::skip_permission_denied)) { ... }
directory_entry 支持缓存状态查询(entry.status()),避免重复系统调用这些函数行为符合 POSIX 和 Windows 语义,自动处理跨设备、只读属性、符号链接等细节。
fs::copy(from, to, fs::copy_options::recursive)(加 recursive 可复制整个目录树)fs::rename(old_p, new_p),原子性操作(同设备),失败时抛异常fs::remove(p) 删除单个文件或空目录;fs::remove_all(p) 递归删除(含非空目录)fs::create_directories(p) 创建完整路径(自动建父目录),比 create_directory 更常用使用前需确保编译器支持 C++17 并启用标准库 filesystem 支持:GCC 需链接 -lstdc++fs,Clang 同理,MSVC 默认支持。头文件为 ,通常用 namespace fs = std::filesystem; 简化书写。不复杂但容易忽略细节——比如路径拼接用 /、异常处理方式、以及递归操作的选项控制。