介紹
文章簡單介紹了兩種處理文件及目錄的方式,一種為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中應 該也不難找到。