Home Page

filesystem简介

filesystem是C++ 17新增的特性,可以很方便的对路径进行操作,遍历以及文件信息获取。注:vs在vs2017后开始对C++ 17支持,vs2015及之前的版本不支持C++ 17
头文件:

#include <filesystem>
using namespace std::filesystem;

常用类

path 类:说白了该类只是对字符串(路径)进行一些处理,这也是文件系统的基石。
directory_entry 类:功如其名,文件入口,这个类才真正接触文件。
directory_iterator 类:获取文件系统目录中文件的迭代器容器,其元素为 directory_entry对象(可用于遍历目录)
file_status 类:用于获取和修改文件(或目录)的属性(需要了解C++11的强枚举类型(即枚举类))

常用库函数

//目录复制
void copy(const path& from, const path& to);	
//获取相对于base的绝对路径			
path absolute(const path& pval, const path& base = current_path());	
//当目录不存在时创建目录
bool create_directory(const path& pval);		
//形如/a/b/c这样的,如果都不存在,创建目录结构			
bool create_directories(const path& pval);	
//用于判断path是否存在			
bool exists(const path& pval);			
//返回目录的大小			
uintmax_t file_size(const path& pval);		
//返回目录最后修改日期的file_time_type对象			
file_time_type last_write_time(const path& pval);
//删除目录			
bool remove(const path& pval);		
//递归删除目录下所有文件,返回被成功删除的文件个数				
uintmax_t remove_all(const path& pval);			
//移动文件或者重命名		
void rename(const path& from, const path& to);			

使用实例

#include <iostream>
#include <filesystem>
using namespace std;

template <typename TP>
std::time_t to_time_t(TP tp)
{
	using namespace std::chrono;
	auto sctp = time_point_cast<system_clock::duration>(tp - TP::clock::now()
		+ system_clock::now());
	return system_clock::to_time_t(sctp);
}
void ProcessPath(const filesystem::path& processPath) 
{
	if (!exists(processPath)) 
	{         //目录不存在直接返回
		cout << "Path is not exists!" << endl;
		return;
	}
	if (filesystem::is_regular_file(processPath))
	{
		cout << "File:"			<< filesystem::path(processPath).filename().string();
		cout << "ParentPath:"	<< processPath.parent_path()<<" ";
		cout << "RootPath: "	<< processPath.root_path()<<" ";
		cout << "root_name: "	<< processPath.root_name() << " ";
		cout << "last_write_time: " << to_time_t(filesystem::last_write_time(processPath));
		cout << "(" << filesystem::file_size(processPath) << " bytes )" << endl;
		return;
	}

	auto begin = filesystem::recursive_directory_iterator(processPath); //获取文件系统迭代器
	auto end = filesystem::recursive_directory_iterator();    //end迭代器 
	for (auto it = begin; it != end; it++) 
	{
		const string spacer(it.depth() * 2, ' ');  //这个是用来排版的空格
		auto& entry = *it;
		if (filesystem::is_regular_file(entry)) 
		{
			//如果是文件entry
			cout << spacer << "File:" << filesystem::path(entry).filename().string();
			cout << "(" << filesystem::file_size(entry) << " bytes )" << endl;
		}
		else if (filesystem::is_directory(entry)) 
		{
			cout << spacer << "Dir:" << filesystem::path(entry).filename() << endl;
		}
	}
}

void Test()
{
	cout << "size: " << filesystem::file_size(L"D:\\Test\\1.test") << endl;
	filesystem::path path(L"D:\\Test");
	ProcessPath(path);
}

image.png

Q.E.D.