C++文件系统库(std::filesystem)实战指南:跨平台文件操作全攻略
本文全面讲解C++17 std::filesystem库的核心API,包括路径操作、目录遍历、文件读写、文件系统查询等实战场景,配合完整代码示例和面试真题,帮你彻底掌握C++跨平台文件编程。
一、filesystem库概览
1.1 为什么需要filesystem
C++17之前,文件操作依赖平台特定API:
// POSIX: dirent.h, stat, opendir/readdir
// Windows: FindFirstFile/FindNextFile
// Boost: boost::filesystem (C++17的前身)
// C++17: 统一标准!
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
// 跨平台路径操作
fs::path p = "/home/user/documents/report.txt";
std::cout << "Filename: " << p.filename() << "\n";
std::cout << "Extension: " << p.extension() << "\n";
std::cout << "Parent: " << p.parent_path() << "\n";
return 0;
}
1.2 编译器支持
| 编译器 | 最低版本 | 链接选项 |
|---|---|---|
| GCC | 8+ | -lstdc++fs (GCC 8), 不需要 (GCC 9+) |
| Clang | 7+ | -lstdc++fs 或 -lc++experimental |
| MSVC | VS 2017 15.7+ | 不需要 |
二、path类详解
2.1 路径构造与分解
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
// 构造路径
fs::path p1("/usr/local/bin/python");
fs::path p2 = "C:\\Users\\Admin\\Documents"; // Windows
fs::path p3 = fs::path("/home") / "user" / "file.txt"; // 拼接
// 路径分解
fs::path p("/home/user/documents/report.txt");
std::cout << "root_name: " << p.root_name() << "\n"; // 空(POSIX)
std::cout << "root_directory: " << p.root_directory() << "\n"; // /
std::cout << "root_path: " << p.root_path() << "\n"; // /
std::cout << "relative_path: " << p.relative_path() << "\n"; // home/user/...
std::cout << "parent_path: " << p.parent_path() << "\n"; // /home/user/documents
std::cout << "filename: " << p.filename() << "\n"; // report.txt
std::cout << "stem: " << p.stem() << "\n"; // report
std::cout << "extension: " << p.extension() << "\n"; // .txt
return 0;
}
2.2 路径操作
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main() {
fs::path p("/home/user/file.txt");
// 修改路径
p.replace_filename("new_file.cpp");
std::cout << p << "\n"; // /home/user/new_file.cpp
p.replace_extension(".h");
std::cout << p << "\n"; // /home/user/new_file.h
// 路径拼接
fs::path dir = "/home/user";
fs::path full = dir / "projects" / "main.cpp";
std::cout << full << "\n"; // /home/user/projects/main.cpp
// 判断路径类型
std::cout << "is_absolute: " << p.is_absolute() << "\n";
std::cout << "is_relative: " << p.is_relative() << "\n";
// 遍历路径组件
fs::path path("/usr/local/bin/python"
453



被折叠的 条评论
为什么被折叠?



