c++17文件系统<filesystem>

前言

  用过旧版C++标准的VS编译器,在遇到处理系统文件名称或者遍历某个文件夹找出所有文件时总是采用C语言中的_tfindfirst、_tfindnext递归查找循环,非常麻烦,C++17终于推出了文件系统处理模块,类似于Qt中的文件系统,易用性大大提高,今天正好看到,记录一下。

一、功能介绍

1)头文件及命名空间

#include
using namespace std::filesystem;

2)常用类

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

3)常用库函数

void copy(const path& from, const path& to) :目录复制

path absolute(const path& pval, const path& base = current_path()) :获取相对于base的绝对路径

bool create_directory(const path& pval) :当目录不存在时创建目录


bool create_directories(const path& pval) :形如/a/b/c这样的,如果都不存在,创建目录结构

bool exists(const path& pval) :用于判断path是否存在

uintmax_t file_size(const path& pval) :返回目录的大小

file_time_type last_write_time(const path& pval) :返回目录最后修改日期的file_time_type对象

bool remove(const path& pval) :删除目录

uintmax_t remove_all(const path& pval) :递归删除目录下所有文件,返回被成功删除的文件个数

void rename(const path& from, const path& to) :移动文件或者重命名

c++17文件系统<filesystem>_第1张图片

二、使用举例

首先,VS编辑器C++语言标准要设定好。
c++17文件系统<filesystem>_第2张图片
代码运行效果:
c++17文件系统<filesystem>_第3张图片
源码如下:

// CFilesystem.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include "pch.h"
#include 
#include  
#include 
using namespace std;
namespace fs = std::experimental::filesystem;

// 计算文件大小
uintmax_t ComputeFileSize(const fs::path& pathToCheck)
{
	if (fs::exists(pathToCheck) && fs::is_regular_file(pathToCheck))
	{
		auto err = std::error_code{};
		auto filesize = fs::file_size(pathToCheck, err);
		if (filesize != static_cast<uintmax_t>(-1))
		{
			return filesize;
		}
	}

	return static_cast<uintmax_t>(-1);
}

// 遍历文件夹找出所有文件(非递归)
void FindAllFile(std::string path)
{
	int count = 0;
	for (auto& v : fs::directory_iterator(path))
	{
		std::string filename = v.path().filename().string();
		//std::cout << "type is:" << typeid(v).name();
		//判断是否正常的文件,如果遍历到文件夹,则可判断出不是正常的文件
		if (fs::is_regular_file(v.path()))
		{
			//std::cout << " is regular_file" << std::endl;
			std::cout << filename << "\n";;
			//std::string extension_name = v.path().extension().string();
			//std::cout << extension_name << std::endl;
		}
		else 
		{
			//std::cout << " not regular_file" << std::endl;
		}
	} 
}

// 遍历文件夹找出所有文件(递归)
void FindTreeFile(std::string path)
{
	for (auto& v : fs::recursive_directory_iterator(path))
	{
		if (fs::is_regular_file(v.path()))
		{
			std::string filename = v.path().filename().string();
			std::cout << filename << std::endl;
			//std::string extension_name = v.path().extension().string();
		//std::cout << extension_name << std::endl;
		}
	} 
}

int main()
{
	// 获取路径的不同部分
	fs::path pathToShow("C:\\Windows\\system.ini");
	cout << "获取路径的不同部分:" << "\n";
	cout << "exists() = " << fs::exists(pathToShow) << "\n"
		<< "root_name() = " << pathToShow.root_name() << "\n"
		<< "root_path() = " << pathToShow.root_path() << "\n"
		<< "relative_path() = " << pathToShow.relative_path() << "\n"
		<< "parent_path() = " << pathToShow.parent_path() << "\n"
		<< "filename() = " << pathToShow.filename() << "\n"
		<< "stem() = " << pathToShow.stem() << "\n"
		<< "extension() = " << pathToShow.extension() << "\n";

	cout << endl;

	// 创建多级路径文件
	cout << "创建多级路径文件:" << "\n";
	std::string outputPath("F:\\test\\TEST.txt");
	std::filesystem::path p(outputPath);
	//p.parent_path()会返回文件路径中的文件夹路径。
	std::filesystem::create_directories(p.parent_path());

	cout << endl;

	// 遍历path
	cout << "遍历path:" << "\n";
	unsigned int i = 0;
	for (const auto& part : pathToShow)
	{
		cout << "path part: " << i++ << " = " << part << "\n";
	}

	cout << endl;

	// 拼接path
	cout << "拼接path:" << "\n";
	fs::path filepath("C:\\temp");
	filepath /= "user";
	filepath /= "data";
	cout << filepath << "\n";

	//fs::path p2("C:\\temp\\");
	//p2 += "user\\";
	//p2 += "data";
	//cout << p2 << "\n";

	cout << endl;

	// 计算文件大小,文件创建修改时间
	cout << "计算文件大小:" << "\n";
	fs::path pathToCheck("F:\\9培训.rar");
	uintmax_t  nLength = ComputeFileSize(pathToCheck);
	cout << "file length: " << nLength << "\n";

	//处理std::asctime编译错误,右击工程-->属性-->配置属性 --> C/C++ --> 命令行-->输入"/D _CRT_SECURE_NO_WARNINGS"-->"确定"
	cout << "文件创建修改时间:" << "\n";
	auto timeEntry = fs::last_write_time(pathToCheck);
	time_t cftime = chrono::system_clock::to_time_t(timeEntry);
	cout << std::asctime(std::localtime(&cftime)) << "\n";

	cout << endl;

	// 获取文件夹内的文件(非递归)
	std::string dirPath = "F:\\123"; 

	cout << "获取文件夹下的文件:" << "\n";
	FindAllFile(dirPath);

	cout << "递归获取文件夹下所有的文件:" << "\n";
	FindTreeFile(dirPath);
}

你可能感兴趣的:(C++学习基础,c++,文件系统filesystem)