std::filesystem 是 C++17 引入的跨平台文件系统库,核心为 path 类,支持路径操作、属性查询、目录遍历及文件管理,统一替代系统 API。

std::filesystem 是 C++17 引入的 标准库 组件,用于跨平台地处理文件路径、查询文件属性、遍历目录、创建 / 删除 / 重命名文件和目录等。它替代了过去依赖系统 API(如 Windows 的 Win32 或 POSIX 的 stat/opendir)的繁琐写法,统一用一套接口适配 Linux、macOS、Windows 等主流系统。
基础类型:path 是核心
std::filesystem::path 是整个库的基石,不是字符串,而是一个智能路径封装类,能自动处理不同系统的路径分隔符(/ vs )、规范化路径(如 ./a/../b → b)、拼接、分解等。
- 构造方式灵活:
fs::path p = "data/log.txt";、fs::path p("config");、fs::path p = fs::current_path() / "cache" / "temp.bin"; - 常用成员:
p.filename()、p.parent_path()、p.extension()、p.has_extension()、p.is_absolute() - 转字符串时注意:
p.string()返回本地 编码(如 Windows 上是 UTF-8 或窄字符,取决于编译设置),推荐用p.generic_string()获取标准化斜杠的字符串(适合日志或调试)
判断与查询:exists、status、file_size 等
用 fs::exists(p) 判断路径是否存在;用 fs::status(p) 获取详细类型和权限信息;再结合 fs::is_regular_file()、fs::is_directory()、fs::is_symlink() 精确识别。
- 检查是否为普通文件并获取大小:
if (fs::is_regular_file(p)) size_t s = fs::file_size(p); - 获取最后修改时间:
auto t = fs::last_write_time(p);返回fs::file_time_type,可转为std::chrono::time_point处理 - 注意:某些操作(如读取时间或大小)在文件被其他进程独占打开时可能抛出
fs::filesystem_error,建议用 try-catch 包裹
目录遍历:recursive_directory_iterator 最常用
遍历一个目录下的所有项(含子目录)推荐用 fs::recursive_directory_iterator;只遍历当前层用 fs::directory_iterator。
立即学习“C++ 免费学习笔记(深入)”;
- 简单递归遍历:
for (const auto& entry : fs::recursive_directory_iterator("/home/user")) {std::cout - 跳过符号链接(避免循环):
fs::recursive_directory_iterator(p, fs::directory_options::skip_permission_denied) - entry 是
fs::directory_entry类型,调用entry.path()、entry.is_directory()、entry.file_size()等方法获取信息
增删改操作:create_directories、remove、rename
创建目录支持多级(类似 shell 的 mkdir -p),删除支持单个文件 / 空目录,或递归删除非空目录;重命名可跨分区(底层自动复制 + 删除)。
- 创建完整路径:
fs::create_directories("a/b/c/d");—— 自动创建 a、a/b、a/b/c - 删除文件或空目录:
fs::remove(p);;强制递归删除:fs::remove_all(p); - 移动 / 重命名:
fs::rename("old.txt", "new.txt");;也可用于移动到另一目录:fs::rename("src/file.dat", "dst/file.dat"); - 注意:这些操作都可能失败(权限不足、路径被占用、磁盘满等),务必检查返回值或捕获异常
编译与兼容性提醒
启用 std::filesystem 需要:C++17 或更高标准 + 链接对应系统库。
- g++/Clang:加
-std=c++17(或c++20),Linux/macOS 还需链接-lstdc++fs(GCC 9+ 可能不再需要);Clang 通常需-lc++fs - MSVC(Visual Studio 2017+):默认支持,无需额外链接,但确保项目设置为 C++17 或以上
- 不支持 C++14 或更早版本;若需兼容旧标准,可用
boost::filesystem作为替代