C++17 [=] <filesystem>
<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;
}