std::filesystem
是 C++17 标准引入的一个强大模块,位于<filesystem>
头文件中,提供了与文件系统交互的接口。这些功能包括文件路径操作、目录遍历、文件操作(如复制、删除)以及文件状态查询等。
以下是std::filesystem
的详细介绍:
引入头文件与命名空间
要使用 std::filesystem
,需要引入头文件:
#include <filesystem>
为了简化书写,通常会使用以下命名空间别名:
namespace fs = std::filesystem;
核心功能与常用类
std::filesystem::path
表示文件系统中的路径。可以是文件路径或目录路径,支持多种平台(Windows、Linux、macOS)。
常见操作
fs::path p1 = "/usr/local/bin";
fs::path p2 = "file.txt";
fs::path combined = p1 / p2; // 拼接路径
std::cout << combined.string() << '\n'; // 输出:/usr/local/bin/file.txt// 获取路径信息
std::cout << combined.root_path() << '\n'; // 根路径:"/"
std::cout << combined.parent_path() << '\n'; // 父路径:"/usr/local/bin"
std::cout << combined.filename() << '\n'; // 文件名:"file.txt"
std::cout << combined.extension() << '\n'; // 扩展名:".txt"
转换路径
string()
:返回路径的字符串形式。wstring()
:返回宽字符串形式(适合 Windows 环境)。u8string()
:返回 UTF-8 字符串。
- 文件状态查询
使用以下函数检查文件或目录的状态:
常用函数
fs::path file_path = "example.txt";if(fs::exists(file_path)) {std::cout << "File exists\n";
}if(fs::is_regular_file(file_path)) {std::cout << "It's a regular file\n"
}if(fs::is_directory(file_path)) {std::cout << "It's a directory\n"
}
函数列表
exists
:检查文件/目录是否存在。is_regular_file
:是否为普通文件。is_directory
:是否为目录。is_symlink
:是否为符号链接。file_size
:获取文件大小。
- 创建与删除
创建目录和文件
fs::create_directory("new_dir"); // 创建单个目录
fs::create_directories("parent_dir/child_dir"); // 递归创建目录
删除文件或目录
fs::remove("file.txt"); // 删除文件或空目录
fs::remove_all("parent_dir"); // 删除目录及其内容
- 文件复制与重命名
复制文件
fs::copy("source.txt", "destination.txt");
复制目录(递归复制)
fs::copy("source_dir","destination_dir",fs::copy_options::recursive);
重命名或移动
fs::rename("old_name.txt", "new_name.txt");
- 目录遍历
遍历目录内容
for (const auto& entry : fs::directory_iterator("some_dir")) {std::cout << entry.path() << '\n';
}
递归遍历目录
for (const auto& entry fs::recursive_directory_iterator("some_dir")) {std::cout << entry.path() << '\n';
}
- 文件时间操作
获取文件的修改时间:
fs::path file_path = "example.txt";
auto ftime = fs::last_write_time(file_path);
auto time = decltype(ftime)::clock::to_time_t(ftime);std::cout << "Last modified: " << std::ctime(&time);
- 文件权限
检查权限
fs::path file_path = "example.txt";auto perms = fs::status(file_path).permissions();
if ((perms & fs::perms::owner_write) != fs::perms::none) {std::cout << "Owner can write to the file.\n";
}
修改权限
fs::permissions("example.txt", fs::perms::owner_write, fs::perm_options::add);
常用 std::filesystem 枚举类型
std::filesystem::file_type
- 表示文件类型。
- 常见值:
regular
: 普通文件。directory
: 目录。symlink
: 符号链接。none
: 不存在的文件。
std::filesystem::perms
- 表示文件权限。
- 常见值:
owner_read
,owner_write
,owner_exec
: 所有者权限。group_read
,group_write
,group_exec
: 组权限。others_read
,others_write
,others_exec
: 其他用户权限。
std::filesystem::copy_options
- 控制复制行为。
- 常见值:
none
: 默认行为。overwrite_existing
: 覆盖已存在的目标文件。recursive
: 递归复制目录。
优点与注意事项
优点
- 跨平台支持: 适配不同操作系统文件系统。
- 简化代码: 提供直观、易用的接口。
- 安全性: 比传统 C 风格的文件操作更安全,避免了路径解析和内存分配问题。
注意事项
- 异常处理:
std::filesystem
操作可能抛出异常(如路径无效或权限不足)。- 应使用
try-catch
块捕获异常。
try {fs::remove("nonexistent_file.txt");
} catch (const fs::filesystem_error& e) {std::cerr << e.what() << '\n';
}
- C++17 支持:
- 确保编译器支持 C++17 或更高版本。
- 某些早期编译器可能需要额外标志(如 -lstdc++fs)。
总结
std::filesystem
提供了强大的文件系统操作能力,能极大简化文件与目录管理的代码逻辑。以下是典型场景及其对应功能:
场景 | 函数/功能 |
---|---|
检查文件或目录是否存在 | fs::exists |
创建或删除目录 | fs::create_directory / remove |
遍历目录内容 | fs::directory_iterator |
文件复制、移动、删除 | fs::copy / rename / remove |
查询文件大小、权限、修改时间 | fs::file_size / status |
通过使用 std::filesystem
,程序员可以更高效地完成文件操作,同时保证代码的可移植性和可维护性。