0
点赞
收藏
分享

微信扫一扫

【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、如果路径中没有找到这个文件:
【C++grammar】文件系统以及path类使用_字符串
2、如果路径中存在这个文件:
【C++grammar】文件系统以及path类使用_#include_02
【C++grammar】文件系统以及path类使用_c++_03
输出文件大小:
【C++grammar】文件系统以及path类使用_字符串_04
3、将p2修改为文件路径:
​​​fs::path p2{ "C:\\Users\\15409\\source\\repos\\file_test" };​​​ 输出该目录下所有文件名字
【C++grammar】文件系统以及path类使用_字符串_05

示例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()
{
//定义路径p
fs::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";
//父路径?文件名?文件名主干?扩展名?
}

效果:

【C++grammar】文件系统以及path类使用_#include_06

示例3:展示path相关的一些特殊运算符用法

示例3:
本部分要展示的内容如下;
任务:展示path相关的一些特殊运算符用法
//必须打开C++17支持
#include <iostream>
#include <filesystem>
#include <string>

namespace fs = std::filesystem;

using std::cout;
using std::endl;

int main()
{
//定义路径p
fs::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;
}

效果:
【C++grammar】文件系统以及path类使用_c++_07

示例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类使用_c++_08


举报

相关推荐

0 条评论