在 C++17 之后,标准库提供了强大的文件系统支持,核心组件是 std::filesystem 命名空间。它为文件、目录、路径等提供了一系列高效、跨平台的操作。下面我们将通过一个完整的示例,展示如何使用 std::filesystem 进行常见的文件系统任务,并解释每一步的关键点。
1. 环境准备
确保编译器支持 C++17 并已开启文件系统库。例如,使用 GCC 9+ 或 Clang 10+,编译时需要加上 -std=c++17 -lstdc++fs(部分编译器会自动链接)。
g++ -std=c++17 main.cpp -o fileops
2. 包含头文件
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
std::filesystem 的实现位于 `
` 头文件中,使用 `namespace fs = std::filesystem;` 简化后续调用。
## 3. 常见操作示例
### 3.1 检查路径是否存在
“`cpp
fs::path p = “./example.txt”;
if (fs::exists(p)) {
std::cout << p << " exists.\n";
} else {
std::cout << p << " does not exist.\n";
}
“`
### 3.2 创建目录
“`cpp
fs::path dir = "./data";
try {
if (!fs::exists(dir)) {
fs::create_directory(dir); // 单级目录
// fs::create_directories(dir); // 多级目录
}
} catch (const fs::filesystem_error& e) {
std::cerr << "Error: " << e.what() << '\n';
}
“`
### 3.3 读取目录内容
“`cpp
for (const auto& entry : fs::directory_iterator(dir)) {
std::cout << entry.path() << (entry.is_directory() ? " [dir]" : " [file]") << '\n';
}
“`
### 3.4 移动与复制文件
“`cpp
fs::path src = dir / "file1.txt";
fs::path dst = dir / "backup_file1.txt";
fs::copy_file(src, dst, fs::copy_options::overwrite_existing);
fs::rename(src, dst); // 或 fs::move
“`
### 3.5 删除文件或目录
“`cpp
fs::remove(dst); // 删除单个文件
fs::remove_all(dir); // 递归删除目录
“`
### 3.6 读取文件内容
“`cpp
#include
std::ifstream infile(src);
if (infile) {
std::string line;
while (std::getline(infile, line)) {
std::cout << line << '\n';
}
}
“`
## 4. 高级功能
### 4.1 递归遍历
“`cpp
for (const auto& entry : fs::recursive_directory_iterator(dir)) {
std::cout << entry.path() << '\n';
}
“`
### 4.2 路径操作
“`cpp
fs::path p = "/home/user/../docs/file.txt";
std::cout << "Normalized: " << fs::canonical(p) << '\n'; // 输出绝对路径
“`
### 4.3 获取文件属性
“`cpp
auto ftime = fs::last_write_time(p);
auto fsize = fs::file_size(p);
std::cout << "Size: " << fsize << " bytes, Last modified: " << std::chrono::system_clock::to_time_t(ftime) << '\n';
“`
## 5. 错误处理
`std::filesystem` 抛出的异常类型为 `std::filesystem::filesystem_error`,包含 `what()`、`path1()`、`path2()` 等信息,帮助定位错误源。
“`cpp
try {
// 某些文件系统操作
} catch (const fs::filesystem_error& e) {
std::cerr << "Filesystem error: " << e.what() << '\n';
std::cerr << "Path1: " << e.path1() << '\n';
if (!e.path2().empty())
std::cerr << "Path2: " << e.path2() << '\n';
}
“`
## 6. 总结
– `std::filesystem` 是 C++17 标准提供的跨平台文件系统 API,避免了传统 `stat`、`opendir` 等低级接口。
– 通过 `exists`、`create_directory`、`directory_iterator`、`copy_file`、`remove_all` 等函数,能高效完成文件与目录的增删改查。
– 错误处理采用异常机制,便于捕获并获取详细错误信息。
– 结合 `
` 可以轻松完成文件读写。
掌握 `std::filesystem` 后,你可以在项目中更安全、更便捷地处理文件系统任务,提升代码可维护性与可移植性。祝你编码愉快!