第108讲 filesystem(1)

在前面的两讲里面我们说了boost的asio的一些使用,其实关于asio的内容还是挺多的,当时考虑到微信的可容纳性所以就直接给他们演示了怎么用他来实现一个完整的例子,所以并没有详细的和大家讲解,好吧,关于asio的详细介绍其实网上还是挺多的,大家如果对网络感兴趣的话又不想了解更底层的东西而又想能够很快的上手那么可以网上多了解一下asio,虽然可能不是最好的,但是也算是小有名气的网络库了,那么今天我们来看看filesystem库的基本使用方法。

关于filesyste,其实现在已经被收纳于C++11标准中,嗯,应该还是在草案阶段吧,在头文件<
filesystem>头文件中,不过我们想要使用编译器自带的filesystem的话,那么我们就要知道目前filesystem的功能都是在tr2中,tr2又是在std中,不知道C++14是否已经不需要引入tr2才能使用filesystem了。

filesystem的核心类是一个path类,这是一个模板类,声明如下:


//===========================================

template<class _String,

class _Traits>

class basic_path{

…………

};

//===========================================

当然对于我们日常使用来说我们可以不关心这个模板类,因为我们我们可以直接使用他为我们typedef好的path就好了,

path如上面所说,是一个typedef,如下:

//===========================================

typedef basic_path<string, path_traits>path;

typedef basic_path<wstring, wpath_traits>wpath;

//===========================================

当然,如果我们想要使用宽字节的话,我们可以使用wpath。

path和其他通用类型一样,提供了移动构造,移动操作,赋值操作,复制构造等等基本的操作,还提供得有隐性转换为string等操作,使用起来是相当的方便的。追加路径,修改后缀,查看父路径,相对路径,绝对路径等等,所以在我们处理和操作系统相关的东西的时候是相当有用的,还支持流式输出、比较,交换路径,还能查看文件大小等等,当然更重要的是提供了可移植性,根据我们使用平台的不同他表现出我们希望看到的结果。

那么说了这么多到底怎么用呢?用起来复杂吗?嗯……其实……真的挺简单的。

构造一个路径,最简单的方式就只直接把路径的字符串给他就好:


boost::filesystem::path p("

E:/Qt_5_4/Workspace/HRECAS/bin/Project/2/data/lisence.txt"

);

于是p就管理这个lisence路径:


//==========================================

boost::filesystem::path p("

E:/Qt_5_4/Workspace/HRECAS/bin/Project/2/data/lisence.txt"

);

std::cout <<p.string() <<std::endl;

std::cout <<p.extension() <<std::endl;

std::cout <<p.root_path().string() <<std::endl;

std::cout <<p.root_directory() <<std::endl;

std::cout <<p.relative_path() <<std::endl;

std::cout <<p.root_name() <<std::endl;

std::cout <<p.parent_path().string() <<std::endl;

std::cout <<p.filename() <<std::endl;

std::cout <<p.stem() <<std::endl;

std::cout <<p.leaf() <<std::endl;

std::cout <<boost::filesystem::exists(p) <<std::endl;

try{

std::cout <<boost::filesystem::file_size(p) <<std::endl;

}

catch (boost::filesystem::filesystem_error e){

std::cout <<e.path1() <<std::endl;

std::cout <<e.what() <<std::endl;

} // 如果使用std::tr2::file_size 对于一个不存在的文件会返回0

// 但是boost的对于不存在的路径会抛出异常


std::cout <<p.replace_extension("

lic"

) <<std::endl;

std::cout <<boost::filesystem::exists(p) <<std::endl;

std::cout <<p.remove_filename() <<std::endl;

std::cout <<boost::filesystem::exists(p) <<std::endl;

std::cout <<boost::filesystem::current_path() <<std::endl;

std::cout <<boost::filesystem::current_path() <<std::endl;

std::cout <<boost::filesystem::initial_path<boost::filesystem::path>() <<std::endl;

std::cout <<boost::filesystem::system_complete(p).string() <<std::endl;

p /= "

lisence.txt"

;

std::cout <<boost::filesystem::system_complete(p).string() <<std::endl;


//===============================================

上面的程序输出如下:

第108讲 filesystem(1)

说了path,那么接下来可以看看状态了,因为我们操作的每一个path都拥有一个状态,他可能是一个文件,也可能是一个目录,可以是一个连接文件也可以是一个设备文件,还可以是管道文件,也还可以是socket文件等等,还有自己的权限,而维护这些东西的是一个file_status的类,该类主要提供了两个操作接口,一个是状态,一个权限,而我们操作该类的时候不是直接使用他,而是使用boost::filesystem::status(path)函数来操作,他返回一个file_tatus对象,于是我们就可以调用type()查看该路径的类型,同样还可以调用type()来设置类型,permissions()查看权限和设置权限等等。

关于文件状态有如下几个,这是一个枚举类型:

//==============================================

status_error=0 // 获取文件类型出错

file_not_found // 文件不存在

status_unknown // 文件存在但状态未知

regular_file // 是一个普通文件

directory_file // 目录文件

symlink_file // link文件

block_file // 设备文件

character_file // 字符设备文件

fifo_file // 管道文件

socket_file // socket文件

type_unknown // 文件类型未知

//===============================================

所以当我们对上面的p执行状态检查的时候我们会得到file_not_found结果,因为这个文件本身就不存在嘛


//===============================================

if (boost::filesystem::status(p).type() == boost::filesystem::file_not_found){

std::cout <<"

文件不存在"

<<std::endl;

}

//==============================================


当然如果你要是觉得多了这么一层使用起来比较烦的话,那么还有你更喜欢的简单方法来判断文件的状态的,那就是直接使用boost::filesystem里面的一些小函数:

//==============================================

boost::filesystem::is_directory(p);

boost::filesystem::is_regular(p);

boost::filesystem::is_symlink(p);

boost::filesystem::is_regular_file(p);

boost::filesystem::is_other(p);

//=============================================

上面的操作其实也是对于上上面的文件状态的,除了明确指出的类型外都是other。


这一讲究到这里吧,下一讲我们再来看文件属性和怎么操作文件等内容


//=============================================

回复D查看目录,回复数字查看相应章节。


原文始发于微信公众号(

C/C++的编程教室

):第108讲 filesystem(1)

|

发表评论