C++C++ 17C++ 17 file_system
枫C++ 17 file_system
C++17 把文件系统库正式纳入了标准库,也就是 <filesystem>。它让路径处理、文件判断、目录遍历这些操作终于有了统一接口,不再总是依赖平台 API 或第三方库。
1. 基本头文件
1 2
| #include <filesystem> namespace fs = std::filesystem;
|
很多示例都会先这样写一个别名,后面调用更方便。
2. 最常见的功能
2.1 路径对象
1
| fs::path p = "/tmp/demo.txt";
|
fs::path 是整个文件系统库里最核心的类型之一。
2.2 判断文件是否存在
2.3 判断是不是目录
1 2
| if (fs::is_directory(p)) { }
|
2.4 获取文件名
1 2
| cout << p.filename() << endl; cout << p.extension() << endl;
|
3. 一个简单示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| #include <filesystem> #include <iostream> using namespace std; namespace fs = std::filesystem;
int main() { fs::path p = "test.txt";
cout << p.filename() << endl; cout << p.extension() << endl; cout << fs::exists(p) << endl; return 0; }
|
4. 遍历目录
4.1 非递归遍历
1 2 3
| for (const auto& entry : fs::directory_iterator(".")) { cout << entry.path() << endl; }
|
4.2 递归遍历
1 2 3
| for (const auto& entry : fs::recursive_directory_iterator(".")) { cout << entry.path() << endl; }
|
5. 创建和删除目录
1 2
| fs::create_directory("demo"); fs::remove("demo");
|
如果是多层目录:
1
| fs::create_directories("a/b/c");
|
6. 路径拼接
1 2
| fs::path base = "/home/user"; fs::path file = base / "docs" / "readme.txt";
|
这个 / 运算符是 filesystem 很顺手的地方之一。
7. 使用时要注意的点
7.1 跨平台只是接口统一,不代表路径规则完全一样
Windows 和 Linux 路径格式仍然不同,但 fs::path 至少帮你屏蔽了一部分拼接细节。
7.2 某些操作可能失败
比如文件不存在、权限不足、路径非法等。
写实际项目时要考虑异常或错误码处理。
7.3 老环境可能还在 experimental 里
部分较老编译器环境里,可能要用 <experimental/filesystem>。
不过现代编译环境一般已经直接支持 <filesystem> 了。
总结
std::filesystem 是 C++17 标准库里很有分量的增强。
它把路径处理、目录遍历、文件判断这些常见操作统一了起来,能显著减少平台相关代码。对于工具程序、桌面应用、服务端程序来说,这个库基本都很有用。