【C++grammar】文件系统以及path类使用
目录
- 1.文件系统概述
- 1、关于路径
- 2、如何将某个路径下的所有文件递归地找出来?
- 2.路径类及操作
- 1、path类的成员函数
- 2、path类的非成员函数
- 示例1:展示C++17中的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 这个命令,将当前目录下面的所有子目录以及文件全部都列出来。
如果我们想用C++17的文件系统库写个类似的程序,将当前目录下面的所有子目录以及文件全部都【递归地】列出来,该怎么做?
获取路径下的所有文件/文件夹,需要遍历的文件夹路径,将子文件夹的路径也添加到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(): path | |
current_path( const path& p ): void | 更改当前路径为p (类似linux指令 cd) |
file_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:展示C++17中的path对象的用法
本部分要展示的内容如下;
展示C++17中的path对象的用法
int main()
{//定义路径,使用生字符串、转义字符串、正斜杠字符串//输出默认文件分隔符//判断是否是常规文件,如果是,输出文件大小//判断是否是目录,如果是目录,列出其子目录//判断路径是否存在
}
修改C++标准可以查看这篇文章:
VS 如何修改C++编译标准
//必须打开C++17支持
#include <iostream>
#include <filesystem>
#include <string>namespace 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************************************/
//必须打开C++17支持
#include <iostream>
#include <filesystem>
#include <string>namespace 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相关的一些特殊运算符用法
//必须打开C++17支持
#include <iostream>
#include <filesystem>
#include <string>namespace 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对象,然后显示磁盘分区信息。
//必须打开C++17支持
#include <iostream>
#include <filesystem>
#include <string>int 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盘。。。
【C++grammar】文件系统以及path类使用相关推荐
- 【Java基础】Java7新特性—Files类,Path类,Paths类的用法
文章目录 Java7新增文件IO类 一.Paths 1.创建Paths 二.Path 1.创建Path 1.1.创建Path的三种方式 2.Path常用方法 三.Files 1.判断方法: 2.删除方 ...
- 对python3中pathlib库的Path类的使用详解
原文连接 https://www.jb51.net/article/148789.htm 1.调用库 ? 1 from pathlib import 2.创建Path对象 ? 1 2 3 4 5 ...
- python3库_对python3中pathlib库的Path类的使用详解
用了很久的os.path,今天发现竟然还有这么好用的库,记录下来以便使用. 1.调用库 from pathlib import 2.创建Path对象 p = Path('D:/python/1.py' ...
- Android之图形图像之使用Path类总结
Path类可以预先在View上将N个点连成一条"路径",然后调用Canvas的drawPath(path,paint)即可沿着路径绘制图形 Android还为路径绘制提供了Path ...
- Python 中的Path类
首先得导入os 模块,path 类属于os模块. 1. Join方法创建路径 要将两个或多个路径组件连接在一起,首先导入 python 的 os 模块,然后使用以下内容: import os myPa ...
- Java NIO文件路径管理:Path类和Paths类
本文章主要包括如下几个章节:类介绍.Path实例获取和文件路径管理.文件路径管理中,主要介绍了Path中定义的主要方法. 1.类的介绍 Path接口 是JDK1.7中定义的接口,主要用来在文件系统中定 ...
- java path类_Java PathParser类代码示例
import org.apache.batik.parser.PathParser; //导入依赖的package包/类 @Override public void start(Stage prima ...
- 自定义控件详解(二):Path类 相关用法
转自:http://www.cnblogs.com/xqxacm/p/6656554.html Path:路径 绘制路径:void drawPath (Path path, Paint paint) ...
- java path类_基于java Files类和Paths类的用法(详解)
Java7中文件IO发生了很大的变化,专门引入了很多新的类: import java.nio.file.DirectoryStream; import java.nio.file.FileSystem ...
最新文章
- radio根据name 获取选中值及判断是否被选中
- LDD3源码分析之字符设备驱动程序
- 【ML】 李宏毅机器学习二:Logistic Regression
- 推荐10个好用到爆的Jupyter Notebook插件,让你效率飞起
- 失眠症的治疗办法有哪几种
- 可运行的c语言程序的扩展名为什么?
- 【强化学习】A3C代码注释版本
- 服务器宕机自动dns,有哪些同时支持智能解析和宕机自动切换的DNS服务?
- 微服务怎么部署到服务器的_微服务的部署与发布:持续交付与持续部署微服务...
- 宁波市中学生计算机程序设计,宁波市第26届中小学生计算机程序设计竞赛初赛试题(小学组)...
- linux screen会话命令
- 学习ExtJs教程初级
- 倒车雷达c语言编程,汽车倒车雷达系统的设计与实现(论文c1)
- 机器学习深度学习视频资料大汇总
- failed to create the npcap service 0x8007007e
- 模拟微博登陆,获取微博cookie
- 淘宝API(拍立淘)———图片搜索
- 六西格玛黑带考试试题|优思学院
- 阿里云新购服务器磁盘disk挂载完整教程
- 各个等级测试工程师所需的必要技能
热门文章
- 【算法图解|2】JavaScript 如何实现数组扁平化
- Linux的shell编写
- gateway 过滤器执行顺序_Gateway网关源码解析—路由(1.1)之RouteDefinitionLocator一览...
- 【HBuilder】手机App推送至Apple App Store过程
- http1.X与2.0
- 经典MapReduce作业和Yarn上MapReduce作业运行机制
- intellij idea中解决java.lang.VerifyError: Expecting a stackmap frame at branch target的方法
- ZOJ Monthly, November 2012
- 字符串分割与存入List集合
- int main(int argc,char* argv[])讲解