Wang's blog

文件系统库

Published on

C++17从boost引入了文件系统库std::filesystem,提供在文件系统及其组件,例如路径、常规文件与目录上进行操作的方法。

path

类型path的对象表示文件系统上的路径,其中包含许多对路径进行操作的成员函数。

namespace fs = std::filesystem;

fs::path p1 = "/path/to/file"; // 使用字符序列构造路径
fs::path p2("/path/to/dir");   // 使用字符序列构造路径
fs::path p3(p1);               // 复制构造路径
p3 = "/path/to/another/file";  // 赋值

p2 /= "dir1";                   // 使用/=拼接路径,加入分隔符
p2 += "dir2";                   // 使用+=拼接路径,不加入分隔符
fs::path p4 = p2 / "dir3";      // 使用/拼接路径,加入分隔符

p1.filename();                  // 获取文件名
p2.stem();                      // 获取文件名主干部分(不含扩展名)
p3.extension();                 // 获取扩展名

p1.has_filename();              // 检查filename()是否为空
p2.has_stem();                  // 检查stem()是否为空
p3.has_extension();             // 检查extension()是否为空

p1.remove_filename();           // 删除文件名
p2.replace_filename("foo");     // 替换文件名
p3.replace_extension(".bar");   // 替换扩展名

p1.string();                    // 转换为string
p2.c_str();                     // 转换为c-string

directory_iterator与recursive_directory_iterator

directory_iterator与recursive_directory_iterator是目录内容的迭代器,它们的区别是directory_iterator不递归迭代子目录。

for (auto &p : fs::directory_iterator("dir"))
    std::cout << p.path() << '\n';

directory_entry

directory_entry表示目录条目,是使用上述迭代器在每次迭代时返回的对象类型。它包含一个path成员,可以调用path()成员函数获取。此外,directory_entry对象中还附带文件属性信息,包括:

  • exists:是否存在
  • is_directory:是否代表目录
  • is_regular_file:是否代表常规文件
  • is_symlink:是否代表符号链接
  • file_size:文件大小

其它非成员函数

std::filesystem命名空间中还提供了许多非成员函数,用于执行各种文件系统操作。包括:

  • absolute:转换为绝对路径
  • copy:复制文件和目录
  • copy_file:复制文件
  • current_path:获取或设置工作目录
  • exists:检查路径是否存在
  • file_size:获取文件大小
  • remove:删除文件或空目录
  • remove_all:删除文件或非空目录
  • rename:重命名
  • is_directory:判断路径是否代表目录
  • is_regular_file:判断路径是否代表常规文件
  • is_symlink:判断路径是否代表符号链接