std::filesystem 是 C++17 引入的跨平台文件系统操作标准库,需 C++17 支持、包含 头文件并推荐使用 fs::path 类型与异常安全操作。

std::filesystem 是 C++17 引入的标准库模块,用于跨平台地操作文件和目录。它替代了过去依赖系统 API(如 Windows 的 FindFirstFile 或 POSIX 的 opendir)的繁琐写法,接口统一、语义清晰、异常安全。
基础准备:包含头文件与命名空间
使用前需确保编译器支持 C++17(如 GCC 8+、Clang 7+、MSVC 2017 15.7+),并在代码中:
- 包含头文件:
#include - 使用命名空间:
namespace fs = std::filesystem;(推荐别名,避免重复输入) - 链接时注意:MSVC 默认支持;GCC/Clang 需加
-lstdc++fs(GCC 9+ 可能不再需要)
路径操作:安全构建与解析路径
fs::path 是核心类型,不是字符串容器,而是路径的逻辑表示,自动处理分隔符(/ 或 \)和编码细节。
- 构造路径:
fs::path p = "data/config.txt";或fs::path p("logs") / "app.log";(/是重载的拼接操作符) - 获取绝对路径:
fs::absolute(p)(基于当前工作目录) - 标准化路径:
p.lexically_normal()消除./、../等冗余部分 - 提取组件:
p.parent_path()、p.filename()、p.extension()(返回.txt)
文件与目录的判断和遍历
用 fs::status() 或快捷函数判断存在性与类型,避免竞态条件(检查后被删除):
立即学习“C++免费学习笔记(深入)”;
- 判断是否存在:
fs::exists(p) - 区分类型:
fs::is_regular_file(p)、fs::is_directory(p)、fs::is_symlink(p) - 递归遍历目录:
for (const auto& entry : fs::recursive_directory_iterator("src")) { ... } - 非递归遍历:
fs::directory_iterator("build")(只扫一层)
每个 directory_entry 支持 entry.path()、entry.is_directory()、entry.file_size() 等便捷访问。
常用文件系统操作:创建、复制、移动、删除
所有操作默认抛出 fs::filesystem_error 异常(可传入 std::error_code& 参数转为错误码处理):
- 创建目录:
fs::create_directories("a/b/c");(自动创建中间不存在的目录) - 复制文件:
fs::copy_file("src.txt", "dst.txt", fs::copy_options::overwrite_existing); - 移动/重命名:
fs::rename("old.txt", "new.txt");(原子操作,跨卷时为复制+删除) - 删除文件或空目录:
fs::remove("temp.log"); - 递归删除目录:
fs::remove_all("build/");
基本上就这些。用好 fs::path 和异常处理,就能写出健壮、可移植的文件操作代码。不复杂但容易忽略细节——比如路径拼接别用 +,要用 /;判断存在性后立刻操作,避免竞态;跨平台时慎用硬编码的分隔符。










