如何使用 C++17 进行文件系统操作:std::filesystem 的入门指南

在 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` 后,你可以在项目中更安全、更便捷地处理文件系统任务,提升代码可维护性与可移植性。祝你编码愉快!

发表评论