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。
在你的系統中運行示例代碼,輸入文件系統中真實存在的不同路徑實參。以下是我們將詳細談論的調用(invocation)
知識點講解:
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實參。
將路徑傳遞給命令行參數,下面是Linux和Windows的測試結果:
我們可以對其做一些改善:
-
文件名(filename)比路徑名(pathname)更易讀。 Linux列表沒有排序。那是因爲directory
-
iteration的順序不是固定的。其順序性依賴於潛在的操作系統API和具體的文件系統。因此我們需要自己對文件系統排序。
解決方案:
使用sort算法可以對包含字符串的容器按照字典序排序