【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,一经查实,立即删除!

相关文章

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

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

leetcode 322. 零钱兑换 思考分析

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

二、训练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…

四、卷积神经网络(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”…

五、项目实战---识别人和马

一、准备训练数据 下载数据集 validation验证集 train训练集 数据集结构如下&#xff1a; 将数据集解压到自己选择的目录下就行 最后的结构效果如下&#xff1a; 二、构建模型 ImageDataGenerator 真实数据中&#xff0c;往往图片尺寸大小不一&#xff0c;需要裁剪成一样…

leetcode 122. 买卖股票的最佳时机 II 思考分析

目录题目贪心法题目 给定一个数组&#xff0c;它的第 i 个元素是一支给定股票第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易&#xff08;多次买卖一支股票&#xff09;。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必…

css设置a连接禁用样式_使用CSS禁用链接

css设置a连接禁用样式Question: 题&#xff1a; Links are one of the most essential aspects of any web page or website. They play a very important role in making our website or web page quite responsive or interactive. So the topic for discussion is quite pe…

leetcode 55. 跳跃游戏 思考分析

题目 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个位置。 示例1&#xff1a; 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步&#xff0c;从位置 0 到达 位置 1…

六、项目实战---识别猫和狗

一、准备数据集 kagglecatsanddogs网上一搜一大堆&#xff0c;这里我就不上传了&#xff0c;需要的话可以私信 导包 import os import zipfile import random import shutil import tensorflow as tf from tensorflow.keras.optimizers import RMSprop from tensorflow.kera…

Origin绘制热重TG和微分热重DTG曲线

一、导入数据 二、传到Origin中 三、热重TG曲线 temp为横坐标、mass为纵坐标 绘制折线图 再稍微更改下格式 字体加粗&#xff0c;Times New Roman 曲线宽度设置为2 横纵坐标数值格式为Times New Roman 根据实际情况改下横纵坐标起始结束位置 四、微分热重DTG曲线 点击曲线…

【嵌入式系统复习】嵌入式网络与协议栈

目录开放式系统互连模型总线通信的报文组形式以及传递方式报文组形式报文传递方式网络分配与调度嵌入式TCP/IP蓝牙技术蓝牙的节能状态纠错方案蓝牙协议栈开放式系统互连模型 ISO/OSI七层模型展示了网络结构与各层的功能。 应用层&#xff1a; 提供了终端用户程序和网络之间的应…

Windows Phone 7 自定义事件

在Windows Phone的应用开发里面&#xff0c;对于事件这种东西我们可以随处可见&#xff0c;系统本来就已经封装好了各种各样的事件机制&#xff0c;如按钮的单击事件等等的。在实际的开发中&#xff0c;我们需要自己去给相关的类自定义一些事件来满足业务的要求&#xff0c;特别…

十四、数据库的导出和导入的两种方法

一、以SQL脚本格式导出&#xff08;推荐&#xff09; 导出 右击需要导出的数据库&#xff0c;任务—>生成脚本 下一步 选择要导出的数据库&#xff0c;下一步 内容根据需求修改&#xff0c;没啥需求直接下一步 勾选 表 勾选需要导出的数据库中的表 选择脚本保存的路…

【C++grammar】文件I/O流的基本用法

目录1、输入输出类介绍1.C/C文件操作对比2.什么是流&#xff1f;3.C I/O流类层次4.带缓冲的输入输出5.gcc编译器cin.in_avail()2、向文件写入数据1.写文件小练习2.如何将信息同时输出到文件和屏幕&#xff1f;3、从文件读数据1.检测文件是否成功打开2.检测是否已到文件末尾3.读…

作业2 分支循环结构

书本第39页 习题2 1.输入2个整数num1和num2.计算并输出它们的和&#xff0c;差&#xff0c;积&#xff0c;商&#xff0c;余数。 //输入2个整数num1和num2.计算并输出它们的和&#xff0c;差&#xff0c;积&#xff0c;商&#xff0c;余数。//#include<stdio.h> int main…

十三、系统优化

系统整体框架图 程序运行进入纺织面料库存管理系统主页面 用户子系统功能演示&#xff1a; 1&#xff0c;点击用户登录进入用户登录页面&#xff0c;可以注册和找回密码 2&#xff0c;注册新用户&#xff0c;账号、密码、性别、手机号均有限制&#xff0c;用户注册需要按指定…

时间工具类[DateUtil]

View Code 1 package com.ly.util;2 3 import java.text.DateFormat;4 import java.text.ParseException;5 import java.text.SimpleDateFormat;6 import java.util.Calendar;7 import java.util.Date;8 9 /**10 * 11 * 功能描述12 * 13 * authorAdministrator14 * Date Jul 19…

leetcode 45. 跳跃游戏 II 思考分析

题目 给定一个非负整数数组&#xff0c;你最初位于数组的第一个位置。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 你的目标是使用最少的跳跃次数到达数组的最后一个位置。 示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。 从下标为 …

一、爬虫基本概念

一、爬虫根据使用场景分类 爬虫&#xff1a; 通过编写程序&#xff0c;模拟浏览器上网&#xff0c;让其去互联网上抓取数据的过程。 ① 通用爬虫&#xff1a;抓取系统重要的组成部分&#xff0c;抓取的是一整张页面的数据 ② 聚焦爬虫&#xff1a;建立在通用爬虫的基础之上&am…