[C++]文件系统filesystem库

文件系统filesystem库

C++17标准的一个重要补充是filesystem库,它使我们能够处理分层文件系统(如Windows或POSIX的文件系统)中的路径、文件和目录。

1 使用文件系统路径

filesystem库位于 <filesystem> 头文件的 std::filesystem 命名空间中。

文件系统组件(文件、目录、硬链接或软链接)的路径由 path 类表示。

1.1 基本操作

  • 创建路径

    1
    auto path = std::filesystem::path{"/home/docs"};
  • 添加元素到路径(包含目录分隔符)

    通过成员操作符 /= ,非成员操作符 / 或者 append() 方法将元素附加到路径,包含目录分隔符

    1
    2
    3
    4
    5
    path /= "Book";
    path = path / "Modern" / "Cpp";
    path.append("Programming");
    // 输出 "/home/docs/book/Modern/Cpp/Programming"
    cout << path << endl;
  • 添加元素到路径(不包含目录分隔符)

    使用成员操作符 += 、非成员操作符 +concat() 方法将元素连接到路径,而不包含目录分隔符

  • 分解目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
    auto path = filesystem::path{"root/home/docs/file.txt"};
    cout
    << "root: " << path.root_name() << '\n'
    << "root dir: " << path.root_directory() << '\n'
    << "root path: " << path.root_path() << '\n'
    << "rel path: " << path.relative_path() << '\n'
    << "parent path: " << path.parent_path() << '\n'
    << "filename: " << path.filename() << '\n'
    << "stem: " << path.stem() << '\n'
    << "extension: " << path.extension() << endl;
    }

    输出:

    1
    2
    3
    4
    5
    6
    7
    8
    root: ""
    root dir: ""
    root path: ""
    rel path: "root/home/docs/file.txt"
    parent path: "root/home/docs"
    filename: "file.txt"
    stem: "file"
    extension: ".txt"
  • 检查目录各个部分

    使用成员函数(如 has_root_name()has_root_directory()has_filename()has_stem()has_extension() )获取路径的各部分是否可用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main()
    {
    auto path = filesystem::path{"root/home/docs/file.txt"};
    cout
    << "has root: " << path.has_root_name() << '\n'
    << "has root dir: " << path.has_root_directory() << '\n'
    << "has root path: " << path.has_root_path() << '\n'
    << "has rel path: " << path.has_relative_path() << '\n'
    << "has parent path: " << path.has_parent_path() << '\n'
    << "has filename: " << path.has_filename() << '\n'
    << "has stem: " << path.has_stem() << '\n'
    << "has extension: " << path.has_extension() << endl;
    }

    输出

    1
    2
    3
    4
    5
    6
    7
    8
    has root: 0
    has root dir: 0
    has root path: 0
    has rel path: 1
    has parent path: 1
    has filename: 1
    has stem: 1
    has extension: 1
  • 检查路径是相对路径还是绝对路径

    is_absolute() 成员函数检查路径是否是绝对路径

  • 修改文件名和扩展名

    replace_filename() 修改文件名,用 remove_filename() 删除文件名,用replace_extension() 修改扩展名

  • 将目录分隔符转换为系统首选的分隔符

    make_preferred() 成员函数将目录分隔符转换为系统首选的分隔符

2 创建、复制和删除文件及目录

filesystem库支持对文件的操作(如复制、移动和删除)以及对目录的操作(如创建、重命名和删除)。

  • 使用 create_directory() 创建新目录。如果目录已经存在,则该函数什么都不做。注意,该方法不会递归的创建目录
  • 使用 create_directories() 递归的创建新目录。

[C++]文件系统filesystem库
https://erlsrnby04.github.io/2024/11/06/C-文件系统filesystem库/
作者
ErlsrnBy04
发布于
2024年11月6日
许可协议