C++17 [=] <filesystem>

2 年前 · 来自专栏 C++ Simple Learning

<filesystem> 是 C++17 提出的 [用于文件操作的] 标准库.

在谈文件操作之前,首先要谈谈 [软链接] (symlink)

对于 [硬链接] (hard_link) 和 [软链接] (symlink)的区别,这篇文章已经说清楚了

简单来说, [软链接] 就是 Windows 系统下的快捷方式,它的特点是 (和硬链接对比),不受文件系统 (NFTS) 的影响,不需要文件路径具体存在。

cppreference 对 [软链接] 的描述是:
a directory entry that associates a name with a path, which may or may not exist.

[硬链接] 实际上是对源文件做一份 copy, 它具有新的 数据块(只存放 文件内容 数据) 和 inode(记录和 [文件内容] 无关的其他的帮助 操作系统 索引 文件 的 [元数据]).

因此, [硬链接] 本质上和 copy 一份 [源文件] 并无区别.

当我们删除 [硬链接] 时, [源文件] 并不会被删除 (两个独立的 文件).

当我们修改 [硬链接] 时, [源文件] 仍然会被修改 (否则就谈不上 链接 了).

我们无法把 [硬链接] 映射到 一个 不存在的路径 (未被创建的路径).

[软链接] 只和 [文件名] 建立 映射关系.

[硬链接] 比 [软链接] 占据更多的 硬盘空间 (软链接 只指向 [源文件] 路径, 不进行 copy 操作).

因此, 由于种种原因, 除非特殊情况 (重要资料备份) 才使用 [硬链接].

一般而言, 我们都建议 开发者 使用 [软链接].

--- ---

如何创立 [软链接] ?

<filesystem> 提供了两个函数, create_symlink 和 create_directory_symlink.

一般而言, 我们只使用 create_symlink, 因为 create_directory_symlink 是为了 [代码可移植] 而设计的, 对于只在 特定系统 上运行的代码, 则不需要考虑这么多.

在开始之前, 我们先简化掉<filesystem>的namespace.

namespace fs = std::filesystem;

create_symlink(const fs:: path & target, const fs::path & link );


毫无疑问,对于开发者而言, [软链接] 更方便代码操作, 所以本文只考虑 [软链接].


file_status 是和 file type 类似的概念,目的就是为了鉴别文件的类型。

filesystem 提供以下几个 function 用于鉴别 file_status (文件类型)

--- ---

设定路径

在 文件操作 过程中, 我们更偏爱 相对路径 (因为路径较短), 而非绝对路径.

调用 fs::current_path() 将会打印 你当前C++项目所在的路径.

在任何操作之前, 我们都要设定一个合理的路径.

首先使用 fs::path pth{ "path" }; 只是一个字符串, Whatever.


--- ---

文件操作的一般步骤

// 设定路径

fs::path pth{ "path" };

// 判断 路径 合法性

if (fs::exists(pth))

// 设定 文件入口

fs::directory_entry entry{ pth };

// 判断是否为 directory, true 是, false 否

is_directory(fs::status(pth))

//

for (const auto& el : fs::directory_iterator(pth)) {

cout << el.path() <<endl;

}

编辑于 2020-10-22 11:28

文章被以下专栏收录

    C++ Simple Learning

    C++ Simple Learning

    This is for C++ beginners