在 C++17 标准中,<filesystem> 库正式加入标准库,它为文件系统的操作提供了统一、跨平台的接口。相比于旧版的 boost::filesystem 或者传统的 POSIX / Windows API,std::filesystem 更加现代化、类型安全,且与 C++ 语言特性深度融合。
以下内容将从以下几个方面深入探讨:
- 核心概念与路径处理
- 文件与目录操作
- 错误处理机制
- 常见使用案例
- 性能与注意事项
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_iterator、fs::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