C++中的std::filesystem库怎么用?C++17文件系统操作教程【跨平台】

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() 或快捷函数判断存在性与类型,避免竞态条件(检查后被删除):

  • 判断是否存在: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 和异常处理,就能写出健壮、可移植的文件操作代码。不复杂但容易忽略细节——比如路径拼接别用 +,要用 /;判断存在性后立刻操作,避免竞态;跨平台时慎用硬编码的分隔符。