C++ 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 判断文件是否存在

1
2
if (fs::exists(p)) {
}

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::filesystemC++17 标准库里很有分量的增强。
它把路径处理、目录遍历、文件判断这些常见操作统一了起来,能显著减少平台相关代码。对于工具程序、桌面应用、服务端程序来说,这个库基本都很有用。