文件目录操作有很多方式,有许多Windows API可用,不过用起来不是那么方便。今天说一下C++11提供的文件目录操作的标准库。
头文件与命名空间:
头文件只需要#include <filesystem>
C++11时还在TR2里面
C++11的命名空间为std::tr2::sys
C++17时已经正式引入了
C++17的命名空间为std::filesystem
路径类path:
路径使用的是path类,可以直接用字符串构造如: sys::path test_file("D:\\a\\b.txt");
路径包含许多常用操作,比如
获取根目录root_path()
获取带扩展名的文件名filename()
获取不带扩展名的文件名stem()
获取扩展名extension()
获取父目录parent_path()
是否是绝对路径 is_absolute()
转成字符串string()
通用函数:
文件是否存在exists
文件大小file_size
文件修改时间last_write_time
创建单个目录create_directory
递归创建目录create_directories
删除目录remove_directory
删除文件Remove
递归删除目录remove_all
重命名Rename
拷贝文件copy_file
是否是目录is_directory
目录遍历:
遍历目录可以用迭代器方式遍历:
sys::path src_dir("F:\\download");//或者const string src_dir = "F:\\download";
set<string> dir_set;
for (sys::directory_iterator end, ite(src_dir); ite != end; ++ite)
{
if(!is_directory(ite->path()))
dir_set.insert(ite->path().filename().string());
};
另一种是递归遍历目录 只需要把directory_iterator改成recursive_directory_iterator就可以了:
for (sys::recursive_directory_iterator end, ite(src_dir); ite != end; ++ite)
{
if(!is_directory(ite->path()))
dir_set.insert(ite->path().filename().string());
}
Filesystem基本上涵盖了常用的文件操作,满足项目需求,还有很多非常用的比如权限、软链接、磁盘空间、目录拼接等等都有,详细的内容可以直接看filesystem头文件或者查看官方文档。