文件、目录及相应的目录字符串的处理
2007-03-25 21:32:36 来源:WEB开发网介绍
文章简单介绍了两种处理文件及目录的方式,一种为boost::filesystem库,一种是用Win32平台上Windows Shell中的Path Functions。
和文件系统的交互操作及对文件及目录字符串的处理,是编程活动中普遍碰到的问题。下面介绍两种不同的方式,借助任意一种都可以大大的加速编程时花在这方面的时间和精力,而且构建出的应用也更稳固。介绍的比较简单,在实际应用时建议大家根据具体需要查看相应的帮助文档。
boost库(www.boost.org)中的filesystem是一个相当实用的用以进行文件和目录操作的库,而且是可以跨平台的。结构清晰合理,封装的相当严谨好用。对于常用的文件遍历操作是通过迭代器来完成的,和STL保持一致。而且这部分的类和接口比较少,帮助文档也相当的清晰。
下面例举一个遍历目录及其子目录查找特定文件的方法(摘自BOOST官方帮助文档)。
bool find_file( const path & dir_path, const std::string & file_name)
{
if ( !exists( dir_path ) ) return false;
directory_iterator end_itr; // default construction yields past-the-end
for ( directory_iterator itr( dir_path ); itr != end_itr; ++itr )
{
if ( is_directory( *itr ) )
{
if ( find_file( *itr, file_name, path_found ) ) return true;
}
else if ( itr->leaf() == file_name )
{
return true;
}
}
return false;
}
说明:
1. exists和is_directory是位于boost::filesystem名字空间中的一些方法。filesystem提供了一个path类,及对这个类进行操作的一些方法,包括判断目录是否存在,文件的拷贝、移动、删除等等。这些方法的参数都包含path对象。
2. directory_iterator是用于遍历目录的迭代器类,操作很简单。注意缺省构造出的实例,可以用作遍历结束的标志,就象代码中所示的那样。
3. leaf是path类的成员方法,返回一个目录字串的最末端,可能是目录名,也可能是文件名。path类定义了很多类似的成员函数。
4. 整个方法采用深度优先的递归算法进行查找。
注意:
在用目录字串构造path对象时,filesystem默认使用unix风格,如果是在windows平台上用windows风格的目录字串进行构造,注意加上native标志,否则会出现异常。例如:
path mypath("c:\", native);
其实如果不是要跨平台,在WIN32下还可以选择使用Windows Shell中提供的一簇函数来处理文件名及路径。这些函数位于Shlwapi.dll中,在Shlwapi.h中申明,在编译选项中注意链接 Shlwapi.lib文件。具体的函数和用法在MSDN中可以很容易查到,有好几十个,非常的丰富,基本上你可想到的对目录及文件字符串进行处理的方法这里都可以找到。可以很方便的处理文件及目录字符串,及URL。缺点是不像boost那样有组织有结构。
这部分在VS2005帮助文档中的位置为:Win32 and COM Development/User Interface/Windows User Experience/Windows Shell/Windows Shell/Shell Reference/Shell Lightweight Utility Functions/Path Functions在其他版本的MSDN中应该也不难找到。
更多精彩
赞助商链接