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