Boost Filesystem模块解析

1.概念

pathname:路径名,比如:"/home/beman/boost/trunk/index.html";
filename:文件名,比如:index.html
stem:词干,比如index.html中的词干为index。
extension:文件扩展名,比如:index.html为html。

路径的格式:
通用格式(generic format):形如/my_directory/my_file.txt这样风格的路径名,它们被类POSIX操作系统使用,比如Unix系列、Linux、和Mac操作系统等。Windows也能识别通用格式,它是熟悉的国际URL格式的基础。目录分隔符是一个或多个斜杠符(slash character)’/’

本地格式(native format):是被特定操作系统自己定义的格式。对于Windows,斜杠‘/’和反斜杠(blackslash)**’’**都可以被用作目录分隔符,比如/my_directory\my_file.txt ,当然,如果你要写成C++字符串形式,就为/my_directory\my_file.txt。
如果在Windows系统的路径名中出现驱动器说明符(a drive specifier)或反斜杠(a blackslash),则将其视为本地格式。

通用格式非常适合编写可移植的程序,这些程序可以在任何操作系统下工作!

2.使用

1)boost::filesystem::path

以下示例代码帮助学习类path的iterators, observers, composition, decomposition, and query functions。
Boost Filesystem模块解析_第1张图片
在你的系统中运行示例代码,输入文件系统中真实存在的不同路径实参。以下是我们将详细谈论的调用(invocation)
Boost Filesystem模块解析_第2张图片
Boost Filesystem模块解析_第3张图片

知识点讲解:
1.通常的一个需求是由一系列的目录组合一个路径名。类path使用/和/=运算符添加元素。但是值得注意的是,这些操作是添加操作系统更偏好的目录分隔符。比如,类POSIX系统是斜杠’/’,而类Windows系统是反斜杠’’。

2.路径名是一系列目录名和文件名元素的组合,为了能分解出各个元素,类class提供了类STL的迭代器的函数begin()和end()。

3.当操作系统内部交互或者和用户交互时,应该使用本地格式观察者(native format observers)。
当希望写出可移植代码时,通用格式观察者应该被使用(generic format observers)。

4.path对象总是以本地格式保存路径名,但在其它情况下,路径名保持原始格式。如果本地格式有多个形式,可以利用preferred()函数转化为操作系统更偏好的格式。比如Windows操作系统,它将斜杠转换为反斜杠。

5.需要注意一点,在Windows系统中,没有根文件名(比如drive specifier or network name),一个单独的slash(or backslash)是一个相对路径(relative path)。但是,在类POSIX系统中是绝对路径(absolute path)。

2)Boost.Filesystem中包含的状态查询函数(status query functions)

boost::filesystem命名空间下有exists, is_directory, 和is_regular_file(是否文件)三个函数。它们都返回bool值,形参都为path类对象。如果满足函数名所描述的条件,则返回true;否则,返回false,包括path实参不能被发现时。

3)目录迭代

Boost.Filesystem的directory_iterator类遵循标准库的istream_iterator的一般模式。它从path构造,遍历目录的内容。默认构造的directory_iterator充当结束迭代器。
directory_iterator的值类型是directory_entry。一个directory_entry对象包含path和file_state信息。它不仅能被直接使用,而且也能在函数调用时传递给path实参。
Boost Filesystem模块解析_第4张图片
将路径传递给命令行参数,下面是Linux和Windows的测试结果:
Boost Filesystem模块解析_第5张图片
我们可以对其做一些改善:

  • 文件名(filename)比路径名(pathname)更易读。 Linux列表没有排序。那是因为directory

  • iteration的顺序不是固定的。其顺序性依赖于潜在的操作系统API和具体的文件系统。因此我们需要自己对文件系统排序。
    解决方案:
    使用sort算法可以对包含字符串的容器按照字典序排序

你可能感兴趣的:(Boost)