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()(仅字符串规范化,不访问文件系统)
文件与目录状态判断:一行代码替代 stat/fstat
通过 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 使用。
立即学习“C++免费学习笔记(深入)”;
- 非递归遍历:
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; 简化书写。不复杂但容易忽略细节——比如路径拼接用 /、异常处理方式、以及递归操作的选项控制。











