想赶紧把c++用起来,先熟悉一下c++的标准库
path对象是filesystem中表示路径的数据结构,path可隐式转换自及转换成 std::basic_string ,这使得在文件 API 上使用它们可行,例如作为到 std::ifstream::open 的参数。path中_M_pathname成员保存的就是我们的路径字符串,但是_M_pathname是一个私有成员。
首先从代表路径的字符串构造:
#include
#include
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
#include
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"
append和operator/=用于路径的连接上,连接路径的时候append和operator/=默认会自动加上/分割符号。
#include
#include
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"
concat和operator+= 同样是来做路径连接的,但是和append和operator/=,concat和operator+= 不会自动添加分割符/。
#include
#include
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;
}
输出结果和上面一致
remove_filename方法可以移除路径上的文件,注意这个方法不会移除目录。
#include
#include
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/"
replace_extension方法会替代路径中文件的扩展名。
#include
#include
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"
swap方法会交换两个path的路径。
#include
#include
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;
}
native以引用的方式返回path中的路径字符串,而c_str就相当于native().c_str()。
#include
#include
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;
}
root_name返回通用格式路径的根名,root_directory返回通用格式路径的根目录,root_path返回路径的根路径。
#include
#include
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"
"/"
"/"
这里注意的是需要输入绝对路径才行。
relative_path返回拆除root的路径,parent_path返回到上一级目录
#include
#include
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"
filename返回路径中的文件名,stem返回路径中的文件名,但是不带扩展名,extension返回路径中文件的扩展名。
#include
#include
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"
检测path对象是否为空。
#include
#include
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
暂时就写这么多吧。