文件系统库
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:判断路径是否代表符号链接