**C++17 版 std::filesystem:让文件操作更简洁**

在 C++17 标准中,<filesystem> 库正式加入标准库,它为文件系统的操作提供了统一、跨平台的接口。相比于旧版的 boost::filesystem 或者传统的 POSIX / Windows API,std::filesystem 更加现代化、类型安全,且与 C++ 语言特性深度融合。

以下内容将从以下几个方面深入探讨:

  1. 核心概念与路径处理
  2. 文件与目录操作
  3. 错误处理机制
  4. 常见使用案例
  5. 性能与注意事项

1. 核心概念与路径处理

1.1 std::filesystem::path

path 对象代表文件系统路径。它内部使用 std::string 存储,但提供了许多实用方法,例如:

namespace fs = std::filesystem;

fs::path p1("/home/user/docs");
fs::path p2("..");
fs::path full = p1 / p2 / "report.txt";
  • / 运算符用于路径拼接,自动处理路径分隔符。
  • p1.parent_path()p1.filename()p1.extension() 等方法可快速提取路径各部分。

1.2 统一分隔符

无论在 Windows (\) 还是 Unix (/) 系统上,/ 都能被识别为分隔符,path 会自动转换为平台对应的形式。读取路径时也可使用 wstring,在 Windows 下可更好地处理 Unicode。


2. 文件与目录操作

操作 函数 说明
检查是否存在 fs::exists(p) 返回 bool
判断是否是目录 fs::is_directory(p)
判断是否是普通文件 fs::is_regular_file(p)
获取文件大小 fs::file_size(p)
创建目录 fs::create_directory(p)fs::create_directories(p)
删除 fs::remove(p)fs::remove_all(p)
重命名/移动 fs::rename(old, new)
复制 fs::copy(src, dst, options)
遍历 fs::directory_iteratorfs::recursive_directory_iterator
获取文件权限 fs::status(p).permissions()
设置权限 fs::permissions(p, perms, perm_options)

示例:复制文件并保持权限

fs::copy(src, dst,
         fs::copy_options::overwrite_existing |
         fs::copy_options::copy_symlinks |
         fs::copy_options::recursive);

3. 错误处理机制

`

` 提供两种错误处理方式: 1. **抛异常**(默认) 函数在遇到错误时抛出 `std::filesystem::filesystem_error`。可捕获错误信息 `what()`,以及涉及的路径 `path1()`、`path2()`。 “`cpp try { fs::remove_all(“/nonexistent”); } catch (const fs::filesystem_error& e) { std::cerr

发表评论