背景
文件的路径操作是写程序时经常遇到的问题,但这类问题在C/C++中很难处理,常见的处理方法有两种。
- 自己手写相关的函数,耗时耗力,正确性还未必能够验证。
- 调用系统的API,但不能跨平台。
然而现在有了第三种方法,在C++17标准中已经集成了路径相关的处理库,直接使用就行,非常方便。
使用
首先看一个简单的示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#include <stdio.h>
#include <filesystem>
// 精简名称空间
namespace fs = std::experimental::filesystem;
int main() {
fs::path path;
// canonical方法用来规范化路径中的斜杠
path = fs::canonical("C://Directory//test.txt");
// 通过string().c_str()将路径转为窄字符便于打印
// 在实际读写文件时,直接通过path.c_str()方法可获得宽字符的路径
printf("%s\n", path.string().c_str()); // C:\Directory\test.txt
path = fs::canonical("C:/Directory/test.txt");
printf("%s\n", path.string().c_str()); // C:\Directory\test.txt
// 以下获取路径中的各个部分
// 获取根名
auto root_name = path.root_name();
printf("root_name: %s\n", root_name.string().c_str()); // root_name: C:
// 获取根目录,Windows下用处不大
auto root_dir = path.root_directory();
printf("root_dir: %s\n", root_dir.string().c_str()); // root_dir: \
// 获取根路径
auto root_path = path.root_path();
printf("root_path: %s\n", root_path.string().c_str()); // root_path: C:\
// 获取父目录
auto parent_dir = path.parent_path();
printf("parent_dir: %s\n", parent_dir.string().c_str()); // parent_dir: C:\Directory
// 获取文件名
auto filename = path.filename();
printf("filename: %s\n", filename.string().c_str()); // filename: test.txt
// 获取主干路径
auto stem = path.stem();
printf("stem: %s\n", stem.string().c_str()); // stem: test
// 获取扩展名
auto ext = path.extension();
printf("ext: %s\n", ext.string().c_str()); // ext: .txt
// 通过 / 重载用来构建路径
auto new_path = parent_dir / "next.txt";
printf("new_path: %s\n", new_path.string().c_str()); // new_path: C:\Directory\next.txt
// 通过命名空间函数判断路径是否存在
auto exist = fs::is_directory(parent_dir);
printf("exist: %d\n", exist); // exist: 0
// 如果不存在那么就创建
// create_directories方法可以递归创建目录,非常方便
auto create_dir = fs::create_directories(parent_dir);
printf("create_dir: %d\n", create_dir); // create_dir: 1
getchar();
return 0;
}
|
运行上面的程序后,相应的输出如下,后续可参考了解该使用哪个函数。
1
2
3
4
5
6
7
8
9
10
11
12
|
C:\Directory\test.txt
C:\Directory\test.txt
root_name: C:
root_dir: \
root_path: C:\
parent_dir: C:\Directory
filename: test.txt
stem: test
ext: .txt
new_path: C:\Directory\next.txt
exist: 0
create_dir: 1
|
参考链接
- 标准库头文件
- std::filesystem::path