c++ std::filesystem怎么用 c++跨平台文件操作【详解】

std::filesystem 是 C++17 引入的跨平台文件系统操作标准库,提供 path 类型自动处理路径分隔符、status/exist 等函数统一判断文件状态、directory_iterator 支持高效目录遍历。

std::filesystem 是 C++17 引入的标准库模块,用于跨平台文件系统操作。它统一了 Windows、Linux、macOS 等系统下路径处理、文件判断、目录遍历、复制删除等常见需求,避免手动拼接路径或调用平台 API(如 statFindFirstFile)。

路径处理:安全、可移植的路径构建与解析

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 使用。

  • 非递归遍历: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; 简化书写。不复杂但容易忽略细节——比如路径拼接用 /、异常处理方式、以及递归操作的选项控制。