C++中使用boost操作文件目录系统
前言
目录、文件处理是脚本语言如shell、python所擅长的领域,在C++17之前,C++语言缺乏对操作系统文件的查询和操作能力。
boost库的filesystem是一个可移植的文件系统操作符,已被收入C++17版本。它在底层做了大量的工作,使用了POSIX标准表示文件系统的路径,接口很类似标准库的容器和迭代器。使C++具有了类似脚本语言的功能,可以跨平台操作目录、文件,写出通用的脚本程序
filesystem库需要system库支持(-lboost_system -lboost_filesystem),位于名字空间boost::filesystem,需要包含头文件<boost/filesystem.hpp>
filesystem使用介绍
filesystem库的核心类是path,它屏蔽了不同文件系统的差异,使用可移植的POSIX语法提供了通用的目录、路径表示。
path的构造函数没有被声明为explicit,因此字符串可以被隐式转换为path对象,这在编写操作文件系统的代码时非常方便,可以不用创建一个临时的path对象。filesystem的成员属性较多,这里只介绍常用到的几个。
初始化一个path 对象,可以如下使用:
boost::filesystem::path path1("./Demo/Demo.txt"); //Linux下
或者
boost::filesystem::path path2("C:\\Boost\\Demo\\include\\");//Windows下
判断路径是否存在,不存在则创建,可以如下使用:
if(!boost::filesystem::exists(folderPath))
{
boost::filesystem::create_directories(folderPath);
}
判断路径是否是绝对路径
path1.is_absolute
判断路径是否是相对路径
path1.is_relative
判断路径是否为空
boost::filesystem::is_empty(path1)
判断路径是否为目录
boost::filesystem::is_directory(path1)
获取文件路径的上层级路径
path1.branch_path
获取文件路径的主干部分
path1.stem
获取文件名
path1.filename
获取文件路径的扩展名
path1.extention
使用示例如下
#include <iostream>
#include <boost/filesystem.hpp>
namespace fs = boost::filesystem;
using namespace std;
int main()
{
boost::filesystem::path path("./Datas/test/");
boost::filesystem::path path1("./Datas/test/test.png");
if (!fs::exists(path))
{
fs::create_directories(path);
}
cout<<path1.is_absolute()<<endl;
cout<<path1.is_relative()<<endl;
cout << fs::is_empty(path) << endl;
cout <<fs::is_directory(path) << endl;
cout << fs::is_directory(path1) << endl;
cout << path1.branch_path() << endl;
cout << path1.stem() << endl;
cout << path1.filename() << endl;
cout << path1.extension() << endl;
system("pause");
}