了解 Boost Filesystem Library

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

了解 Boost Filesystem Library

C++语言(实际上是C++标准)的最常见问题之一是,缺乏定义良好的库来帮助处理文件系统查询和操作。由于这个原因,程序员不得不使用本机操作系统提供的应用程序编程接口(Application Program Interfaces,API),而这使得代码不能在平台之间移植。以下面的简单情况为例:您需要确定某个文件是否是Directory 类型。在Microsoft® Windows® 平台中,可以通过调用GetAttributes库函数(在windows.h 头文件中定义)进行此操作:

DWORD GetFileAttributes (LPCTSTR lpFileName);

对于目录,所得到的结果应该为FILE_ATTRIBUTE_DIRECTORY,而您的代码必须检查是否为此结果。在UNIX® 和Linux® 平台上,可以通过使用stat或fstat函数及sys/stat.h 中定义的S_ISDIR 宏来实现相同的功能。您还必须理解stat结构。下面是对应的代码:

#include

#include

int main()

{

struct stat s1;

int status = stat(, &s1);

printf(“Path is a directory : %d\n”, S_ISDIR(s1.st_mode));

return 0;

}

对于I/O 操作较多的程序,这样的不一致就意味着需要进行大量的工程工作才能在平台间移植代码。正是因为这个原因,我们才引入了Boost Filesystem Library。这个广泛使用的库提供了安全、可移植且易用的C++接口,用于执行文件系统操作。可以从Boost站点免费下载此库。

使用boost::filesystem 的第一个程序

在深入研究Boost Filesystem Library 的更多细节之前,请看一下清单1中所示的代码;此代码使用Boost API 确定某个文件的类型是否为Directory。

清单1. 用于确定某个文件的类型是否为Directory 的代码

#include

#include “boost/filesystem.hpp”

int main()

{

boost::filesystem::path path("/usr/local/include"); // random pathname

bool result = boost::filesystem::is_directory(path);

printf(“Path is a directory : %d\n”, result);

return 0;

}

此代码非常明了易懂,您并不需要了解任何系统特定的例程。此代码经过验证,能在不用修改的情况下在gcc-3.4.4 和cl-13.10.3077 上成功编译。

回页首

了解Boost path 对象

了解Boost Filesystem Library 的关键是path对象,因为Filesystem Library 中定义的多个例程都要对相应的path对象操作。文件系统路径通常依赖于操作系统。例如,众所周知,UNIX 和Linux 系统使用正斜杠( /) 字符作为目录分隔符,而Windows 将反斜杠(\) 字符用于类似的用途。boost::filesystem::path旨在准确地抽象此特性。path对象可以通过多种方式进行初始化,最常见的方式是使用char*或std::string进行初始化,如清单2中所示。

清单2. 创建Boost path 对象的方法

path(); // empty path

path(const char* pathname);

path(const std::string& pathname);

path(const char* pathname, boost::filesystem::path::name_check checker);

path(const char* pathname, boost::filesystem::path::name_check checker);

在初始化path对象时,可以采用本机格式或可移植操作系统接口(Portable Operating System Interface,POSIX)委员会定义的可移植格式提供PATHNAME 变量。这两种方法在实际中各有优缺点。考虑以下情况:您希望操作软件所创建的目录,此目录在UNIX 和Linux 系统上位于/tmp/mywork,而在Windows 上位于C:\tmp\mywork。可以采用多种方法处理问题。清单3显示了面向本机格式的方法。

清单3. 使用本机格式初始化path

#ifdef UNIX

boost::filesystem::path path("/tmp/mywork");

#else

boost::filesystem::path path("C:\\tmp\\mywork ");

#endif

需要单个#ifdef来按操作系统初始化path 对象。不过,如果您喜欢使用可移植格式,请参见清单4。

清单4. 使用可移植格式初始化path

boost::filesystem::path path("/tmp/mywork");

请注意,path::name_check指的是一个名称检查函数原型。如果其参数输入PATHNAME 对于特定的操作系统或文件系统有效,名称检查函数将返回“True”。Boost Filesystem Library 提供了多个名称检查函数,而且也欢迎您提供自己的变体。常用的名称检查函数是Boost 提供的portable_posix_name和windows_name。

回页首

相关文档
最新文档