【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盘。。。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377659.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala hashmap_如何在Scala中将Hashmap转换为Map?

scala hashmapLets first understand what are maps and hashmaps? 首先让我们了解什么是map和hashmap &#xff1f; map in Scala is a collection that stores its elements as key-value pairs, like a dictionary. Scala中的map是一个集合&#xff0c;将其元素存储为键值…

十二、所有功能实现效果演示

一、系统项目架构 Ⅰ&#xff0c;fiber_yy数据库下有五张表 yy_admin&#xff1a;管理员登录账号和密码 yy_textile&#xff1a;纺织面料数据信息 yy_textile_record&#xff1a;用户购买纺织面料信息所存储的面料流水信息 yy_user&#xff1a;用户登录注册信息 yy_user_reco…

行业软件之PTV微观软件VISSIM4.3 5.0 5.1 5.2 5.3 5.4下载和相关资料

他是干什么的&#xff1a;http://baike.baidu.com/view/3656765.htm 中国代理销售的公司的网址&#xff1a;辟途威交通科技(上海)有限公司 官网&#xff1a;http://www.ptvchina.cn/ 看看视频中软件的运行效果&#xff1a;http://v.youku.com/v_show/id_XMzExMjg1MDEy.html 如何…

一、单个神经元网络构建

一、本人使用编译器为Jupyter Notebook&#xff0c;tensorflow版本为1.13.1 import tensorflow as tf print(tf.__version__) """ 1.13.1 """二、训练单个神经元网络 x为-1.0, 0.0, 1.0, 2.0, 3.0, 4.0 y为-3.0, -1.0, 1.0, 3.0, 5.0, 7.0 人用…

ruby 生成随机字符串_Ruby程序生成随机数

ruby 生成随机字符串产生随机数 (Generating random number) The task is to generate and print random number. 任务是生成并打印随机数。 Generating random numbers means that any number can be provided to you which is not dependent on any pre-specified condition…

leetcode 322. 零钱兑换 思考分析

目录1、题目2、思路分析3、参考链接1、题目 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1。 你可以认为每种硬币的数量是无限的。 提示&#xff1a; 1 …

linux上的英文字体monospace可以在windows用吗?

linux的字体都是开源的&#xff0c;应该可以官方下载本地下载转载于:https://www.cnblogs.com/52linux/archive/2012/03/14/2396103.html

Flash Builder 创建CSS

1.global 选择器将样式应用于所有控件 在 Flash Builder 中创建新MXML 文件并切换到设计模式 属性视图右侧的外观视图可更改外观 Flash Builder 自动创建CSS 文件 CSS 文件有2 个命名空间&#xff1a; s 指 Spark 组件 mx 指 MX 组件 1. Global 与Application 选择器 global …

ruby打印_Ruby程序打印数字的力量

ruby打印Ruby中数字的幂 (Power of a number in Ruby) The task to develop a program that prints power of a number in Ruby programming language. 开发可以用Ruby编程语言打印数字幂的程序的任务。 If we want to calculate the power of a number manually then we have…

二、训练fashion_mnist数据集

一、加载fashion_mnist数据集 fashion_mnist数据集中数据为28*28大小的10分类衣物数据集 其中训练集60000张&#xff0c;测试集10000张 from tensorflow import keras import tensorflow as tf import matplotlib.pyplot as plt import numpy as npfashion_mnist keras.data…

jquerymobile 切换页面时候闪烁问题

https://github.com/jquery/jquery-mobile/commit/acbec71e29b6acec6cd2087e84e8434fecc0053f 可以修改css好像是个bug -4,9 4,10 * Dual licensed under the MIT (MIT-LICENSE.txt) or GPL (GPL-LICENSE.txt) licenses.*/.spin {--webkit-animation-name: spin;--webkit-an…

二分法:两个有序数组长度为N,找到第N、N+1大的数

题目 两个有序数组长度为N&#xff0c;找到第N、N1大的数 思路1&#xff1a;双指针&#xff0c;O(N)复杂度 简述思路&#xff1a; 如果当前A指针指向的数组A的内容小于B指针指向的数组B的内容&#xff0c;那么A指针往右移动&#xff0c;然后nums(当前已经遍历过的数字个数)也…

Javascript -- In

http://www.caveofprogramming.com/articles/javascript-2/javascript-in-using-the-in-operator-to-iterate-through-arrays-and-objects/ http://msdn.microsoft.com/en-us/library/ie/9k25hbz2(vvs.94).aspx转载于:https://www.cnblogs.com/daishuguang/p/3392310.html

三、自动终止训练

有时候&#xff0c;当模型损失函数值预期的效果时&#xff0c;就可以结束训练了&#xff0c;一方面节约时间&#xff0c;另一方面防止过拟合 此时&#xff0c;设置损失函数值小于0.4&#xff0c;训练停止 from tensorflow import keras import tensorflow as tf import matplo…

矩阵形状| 使用Python的线性代数

Prerequisite: Linear Algebra | Defining a Matrix 先决条件&#xff1a; 线性代数| 定义矩阵 In the python code, we will add two Matrices. We can add two Matrices only and only if both the matrices have the same dimensions. Therefore, knowing the dimensions o…

[数据库]oracle客户端连服务器错误

昨天晚上和今天上午用11g客户端连同事10g服务器&#xff0c;报错&#xff1a; The Network Adapter could not establish the connection 检查尝试了好多次都没好。 用程序连&#xff0c;依旧是报这个错&#xff0c;所以一查就解决了&#xff01; 参考&#xff1a;http://apps…

ASP.NET 抓取网页内容

&#xff08;转&#xff09;ASP.NET 抓取网页内容 ASP.NET 抓取网页内容&#xff0d;文字 ASP.NET 中抓取网页内容是非常方便的&#xff0c;而其中更是解决了 ASP 中困扰我们的编码问题。 需要三个类&#xff1a;WebRequest、WebResponse、StreamReader。 WebRequest、WebRespo…

leetcode 53. 最大子序和 动态规划解法、贪心法以及二分法

题目 给定一个整数数组 nums &#xff0c;找到一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大&#xff0c;为 6。 进阶: 如果你…

四、卷积神经网络(Convolution Neural Networks)

一、CNN(Convolution Neural Networks) 卷积神经网络基本思想&#xff1a;识别物体的特征&#xff0c;来进行判断物体 卷积Convolution&#xff1a;过滤器filter中的数值与图片像素值对应相乘再相加&#xff0c;6 * 6卷积一次(步数为1)变成4 * 4 Max Pooling&#xff1a;对卷积…

POJ3096Surprising Strings(map)

题意&#xff1a;输入很多字符串&#xff0c;以星号结束。判断每个字符串是不是“Surprising Strings”&#xff0c;判断方法是&#xff1a;以“ZGBG”为例&#xff0c;“0-pairs”是ZG&#xff0c;GB&#xff0c;BG&#xff0c;这三个子串不相同&#xff0c;所以是“0-unique”…