c++标准库学习-filesystem文件系统库(1)-path对象

前言

想赶紧把c++用起来,先熟悉一下c++的标准库

一.path对象

path对象是filesystem中表示路径的数据结构,path可隐式转换自及转换成 std::basic_string ,这使得在文件 API 上使用它们可行,例如作为到 std::ifstream::open 的参数。path中_M_pathname成员保存的就是我们的路径字符串,但是_M_pathname是一个私有成员。

1.path的构造

首先从代表路径的字符串构造:

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="~/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<endl;
	return 0;
}

然后也可以从其他path对象复制构造:

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="~/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
	fs::path p2=p1;
	std::cout<<"p2:"<<p2<<std::endl;
	return 0;
}

输出结果:

p1:"~/桌面/dter/detr/test_all.py"
p2:"~/桌面/dter/detr/test_all.py"

二.path对象的常用成员方法

1.append和operator/=

append和operator/=用于路径的连接上,连接路径的时候append和operator/=默认会自动加上/分割符号。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="~/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
	fs::path p2=p1;
	std::cout<<"p2:"<<p2<<std::endl;
    p2.clear();
    p2=p2.assign("~/桌面/dter/detr");
    std::cout<<"p2:"<<p2<<std::endl;
    p2=p2/"test_all.py";
    std::cout<<"p2:"<<p2<<std::endl;
	return 0;
}

输出结果:

p1:"~/桌面/dter/detr/test_all.py"
p2:"~/桌面/dter/detr/test_all.py"
p2:"~/桌面/dter/detr"
p2:"~/桌面/dter/detr/test_all.py"

2.concat和operator+=

concat和operator+= 同样是来做路径连接的,但是和append和operator/=,concat和operator+= 不会自动添加分割符/。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="~/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
	fs::path p2=p1;
	std::cout<<"p2:"<<p2<<std::endl;
    p2.clear();
    p2=p2.assign("~/桌面/dter/detr");
    std::cout<<"p2:"<<p2<<std::endl;
    p2=p2+="/test_all.py";
    std::cout<<"p2:"<<p2<<std::endl;
	return 0;
}

输出结果和上面一致

3.remove_filename

remove_filename方法可以移除路径上的文件,注意这个方法不会移除目录。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="~/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
    p1=p1.remove_filename();
    std::cout<<"p1:"<<p1<<std::endl;
	return 0;
}

输出结果:

p1:"~/桌面/dter/detr/test_all.py"
p1:"~/桌面/dter/detr/"

4.replace_extension

replace_extension方法会替代路径中文件的扩展名。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="~/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
    p1=p1.replace_extension("cpp");
    std::cout<<"p1:"<<p1<<std::endl;
	return 0;
}

输出结果:

p1:"~/桌面/dter/detr/test_all.py"
p1:"~/桌面/dter/detr/test_all.cpp"

5.swap

swap方法会交换两个path的路径。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="~/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
    fs::path p2="./path.cpp";
    std::cout<<"p2:"<<p2<<std::endl;
    p1.swap(p2);
    std::cout<<"p1:"<<p1<<std::endl;
    std::cout<<"p2:"<<p2<<std::endl;
	return 0;
}

6.c_str, native

native以引用的方式返回path中的路径字符串,而c_str就相当于native().c_str()。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="~/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
    std::string native=p1.native();
    std::cout<<native<<std::endl;
    const char *c_str=p1.c_str();
    std::cout<<c_str<<std::endl;
	return 0;
}

7.root_name,root_directory,root_path

root_name返回通用格式路径的根名,root_directory返回通用格式路径的根目录,root_path返回路径的根路径。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="/home/ztyf/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
    std::cout<<p1.root_directory()<<std::endl;
    std::cout<<p1.root_path()<<std::endl;
	return 0;
}

输出结果:

p1:"/home/ztyf/桌面/dter/detr/test_all.py"
"/"
"/"

这里注意的是需要输入绝对路径才行。

8.relative_path,parent_path

relative_path返回拆除root的路径,parent_path返回到上一级目录

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="/home/ztyf/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
    std::cout<<p1.relative_path()<<std::endl;
    std::cout<<p1.parent_path()<<std::endl;
	return 0;
}

输出结果:

p1:"/home/ztyf/桌面/dter/detr/test_all.py"
"home/ztyf/桌面/dter/detr/test_all.py"
"/home/ztyf/桌面/dter/detr"

9.filename,stem,extension

filename返回路径中的文件名,stem返回路径中的文件名,但是不带扩展名,extension返回路径中文件的扩展名。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="/home/ztyf/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
    std::cout<<p1.filename()<<std::endl;
    std::cout<<p1.stem()<<std::endl;
    std::cout<<p1.extension()<<std::endl;
	return 0;
}

输出结果:

p1:"/home/ztyf/桌面/dter/detr/test_all.py"
"test_all.py"
"test_all"
".py"

10.empty

检测path对象是否为空。

#include<iostream>
#include<filesystem>
namespace fs = std::filesystem;
int main(int argc,char *argv[])
{
	fs::path p1="/home/ztyf/桌面/dter/detr/test_all.py";
	std::cout<<"p1:"<<p1<<std::endl;
    fs::path p2="./path.cpp";
    p2.clear();
    std::cout<<"p1 empty?"<<p1.empty()<<"   "<<"p2 empty?"<<p2.empty()<<std::endl;
	return 0;
}

输出结果:

p1:"/home/ztyf/桌面/dter/detr/test_all.py"
p1 empty?0   p2 empty?1

三.总结

暂时就写这么多吧。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

追天一方

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值