背景

文件的路径操作是写程序时经常遇到的问题,但这类问题在C/C++中很难处理,常见的处理方法有两种。

  1. 自己手写相关的函数,耗时耗力,正确性还未必能够验证。
  2. 调用系统的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

参考链接

  1. 标准库头文件 
  2. std::filesystem::path