12306的网站是哪个公司做的,刷关键词排名,时间线wordpress主题,怎样维护网站的安全和备份目录1.文件系统概述1、关于路径2、如何将某个路径下的所有文件递归地找出来#xff1f;2.路径类及操作1、path类的成员函数2、path类的非成员函数示例1#xff1a;展示C17中的path对象的用法示例2#xff1a;展示Path类中用于分解路径成分的函数示例3#xff1a;展示path相… 目录1.文件系统概述1、关于路径2、如何将某个路径下的所有文件递归地找出来2.路径类及操作1、path类的成员函数2、path类的非成员函数示例1展示C17中的path对象的用法示例2展示Path类中用于分解路径成分的函数示例3展示path相关的一些特殊运算符用法示例4展示如何获取磁盘空间信息 1.文件系统概述
标准库的filesystem提供在文件系统与其组件例如路径、常规文件与目录上进行操作的方法。 (1) File(文件)持有数据的文件系统对象能被写入或读取。文件有名称和属性属性之一是文件类型 (2) Path(路径)标识文件所处位置的一系列元素可能包含文件名 namespace fs std::filesystem; fs::path p{ “CheckPath.cpp” };
1、关于路径
绝对路径包含完整的路径和驱动器符号 相对路径不包含驱动器及开头的/符号文件存在相对于“当前路径”的位置。
//为名字空间起一个别名
namespace fs std::filesystem;
fs::path p1(d:\\cpp\\hi.txt); //字符串中的反斜杠要被转义
fs::path p2(); //Windows 也支持正斜杠
fs::path p3(R(d:\cpp\hi.txt)); //使用原始字符串字面量 2、如何将某个路径下的所有文件递归地找出来
我们在windows上可以使用tree /f 这个命令将当前目录下面的所有子目录以及文件全部都列出来。
如果我们想用C17的文件系统库写个类似的程序将当前目录下面的所有子目录以及文件全部都【递归地】列出来该怎么做 获取路径下的所有文件/文件夹,需要遍历的文件夹路径将子文件夹的路径也添加到list集合中就可以了。
2.路径类及操作
1、path类的成员函数
部分重要的成员函数说明path(string)构造函数assign(string): path为路径对象赋值append(type p): path将p追加到路径后。type是string、path或const char*。等价于 / 运算符自动添加目录分隔符concat(type p): path将p追加到路径后。type是string、path或const char*。等价于运算符不自动添加目录分隔符clear(): void清空存储的路径名remove_filename(): path从给定的路径中移除文件名replace_filename(const path replacement): path以 replacement 替换文件名root_name(): path返回通用格式路径的根名root_directory(): path返回通用格式路径的根目录root_path(): path返回路径的根路径等价于 root_name() / root_directory()即“路径的根名 / 路径的根目录”relative_path(): path返回相对于 root-path 的路径parent_path(): path返回到父目录的路径filename(): path返回路径中包含的文件名stem(): path返回路径中包含的文件名不包括文件的扩展名extension(): path返回路径中包含的文件名的扩展名empty(): bool检查路径是否为空has_xxx(): bool其中“xxx”是上面“分解”类别中的函数名。这些函数检查路径是否含有相应路径元素
2、path类的非成员函数
部分重要的非成员函数说明operator/( const path lhs, const path rhs )以偏好目录分隔符连接二个路径成分 lhs 和 rhs。比如 path p{“C:”}; p p / “Users” / “batman”;operator , (path p)进行路径 p 上的流输入或输出s_regular_file( const path p ): bool检查路径是否是常规文件is_directory( const path p ): bool检查路径是否是目录is_empty( const path p ): bool检查给定路径是否指代一个空文件或目录current_path(): pathcurrent_path( const path p ): void更改当前路径为p 类似linux指令 cdfile_size( const path p ): uintmax_t对于常规文件 p 返回其大小尝试确定目录(以及其他非常规文件)的大小的结果是由编译器决定的space(const path p): space_info返回路径名 p 定位于其上的文件系统信息。space_info中有三个成员capacity ——文件系统的总大小(字节)free ——文件系统的空闲空间(字节)available ——普通进程可用的空闲空间小于或等于 free status(const path p): file_status返回 p 所标识的文件系统对象的类型与属性。返回的file_status是一个类其中包含文件的类型(type)和权限(permissions)remove(const path p): bool删除路径 p 所标识的文件或空目录remove_all(const path p): uintmax_t递归删除 p 的内容若它是目录及其子目录的内容然后删除 p 自身返回被删文件及目录数量rename(const path old_p,const path new_p): void移动或重命名 old_p 所标识的文件系统对象到 new_p(类似linux指令mv)copy( const path from, const path to ): void复制文件与目录。另外一个函数 bool copy_file(from, to) 拷贝单个文件create_directory( const path p ): bool创建目录 p 父目录必须已经存在,若 p 已经存在则函数无操作create_directories( const path p ): bool创建目录 p 父目录不一定存在,若 p 已经存在则函数无操作
示例1展示C17中的path对象的用法
本部分要展示的内容如下;
展示C17中的path对象的用法
int main()
{//定义路径使用生字符串、转义字符串、正斜杠字符串//输出默认文件分隔符//判断是否是常规文件如果是输出文件大小//判断是否是目录如果是目录列出其子目录//判断路径是否存在
}修改C标准可以查看这篇文章 VS 如何修改C编译标准
//必须打开C17支持
#include iostream
#include filesystem
#include stringnamespace fs std::filesystem;int main()
{//定义路径使用生字符串、转义字符串、正斜杠字符串//生字符串fs::path p1{R(C:\Users\15409\source\repos\file_test\Hello.txt)};//转义字符串fs::path p2{ C:\\Users\\15409\\source\\repos\\file_test\\Hello.txt };//正斜杠字符串fs::path p3{ C:/Users/15409/source/repos/file_test/Hello.txt };//输出默认文件分隔符std::cout fs::path::preferred_separator std::endl;//判断是否是常规文件如果是输出文件大小if (fs::is_regular_file(p2)){std::cout p2 s size is:fs::file_size(p2) std::endl;}//如果不是常规文件的话可能是一个目录else if (fs::is_directory(p2)){std::cout p2 is a directory,includes: std::endl;//打印出它的所有子目录for (auto e : fs::directory_iterator(p2))std::cout e.path() std::endl;}//判断路径是否存在else if (fs::exists(p2)){std::cout p2 is a special file\n;}//文件不存在else{std::cout p2 is not exist\n std::endl;}
}效果 1、如果路径中没有找到这个文件 2、如果路径中存在这个文件 输出文件大小 3、将p2修改为文件路径 fs::path p2{ C:\\Users\\15409\\source\\repos\\file_test }; 输出该目录下所有文件名字
示例2展示Path类中用于分解路径成分的函数
示例2
本部分要展示的内容如下;
任务展示Path类中用于分解路径成分的函数是否存在根名根路径相对路径父路径文件名文件名主干扩展名/*****************************示例2************************************/
//必须打开C17支持
#include iostream
#include filesystem
#include stringnamespace fs std::filesystem;using std::cout;
using std::endl;int main()
{//定义路径pfs::path p{R(C:\Users\15409\source\repos\file_test\main.cpp)};//是否存在根名根路径相对路径if (p.empty()){cout Path p is empty. endl;}if (!fs::exists(p)){cout Path p dose not exist. endl;std::exit(0);}cout root_name(): p.root_name() \n root_path(): p.root_path() \n relative_path(): p.relative_path() \n;cout parent_path(): p.parent_path() \n filename(): p.filename() \n stem(): p.stem() \n extension(): p.extension() \n;//父路径文件名文件名主干扩展名
}效果 示例3展示path相关的一些特殊运算符用法
示例3
本部分要展示的内容如下;
任务展示path相关的一些特殊运算符用法//必须打开C17支持
#include iostream
#include filesystem
#include stringnamespace fs std::filesystem;using std::cout;
using std::endl;int main()
{//定义路径pfs::path p1{ R(C:\Users\15409\source\repos) };fs::path p2{ R(C:\Users\15409\source\repos) };fs::path p3{ };//append 和 /p1.append(R(file_test));p1 / R(p1);cout p1 endl;//concat 和 , 这两个操作和上面两个的区别在于不会主动添加斜杠p2.concat(R(file_test));p2 R(p2);cout p2 endl;//用运算符 / 拼凑一个新路径,是对一个path对象进行拼接不能对字符串进行拼接p3 p3 / R(file_test) / R(p3);cout p3 endl;
}效果
示例4展示如何获取磁盘空间信息
示例4
本部分要展示的内容如下;
任务展示如何获取磁盘空间信息任务
使用filesystem::space()函数获取某路径所在分区的space_info对象然后显示磁盘分区信息。//必须打开C17支持
#include iostream
#include filesystem
#include stringint main()
{namespace fs std::filesystem;using std::cout;using std::endl;//定义路径对象fs::path p{C:\\};//展示磁盘的总大小和剩余大小,显示的是字节数cout C:total space: fs::space(p).capacity b endl;cout C:free space: fs::space(p).free b endl;cout C:total space: fs::space(p).capacity/(1024*1024*1024) G endl;cout C:free space: fs::space(p).free/ (1024 * 1024 * 1024) G endl;
}效果我的C盘。。。