日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

了解 Boost Filesystem Library文件系统

發布時間:2025/3/21 windows 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 了解 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 <sys/stat.h> #include <stdio.h> int main(){struct stat s1;int status = stat(<const char* denoting pathname>, &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 <stdio.h> #include “boost/filesystem.hpp” int main(){boost::filesystem::path path("/usr/local/include"); // random pathnamebool 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。

path 成員函數概述

path?對象提供了多個成員方法。這些成員例程并不會修改文件系統,但會根據 path 名稱提供有用的信息。此部分提供了其中幾個例程的概述:

  • const std::string& string( ):此例程會返回用于初始化 path 的字符串的副本,其格式符合 path 語法規則。
  • std::string root_directory( ):在提供了路徑的情況下,此 API 將返回根目錄,否則將返回空字符串。例如,如果路徑包含/tmp/var1,則此例程將返回?/,即 UNIX 文件系統的根。不過,如果路徑是相對路徑,如?../mywork/bin,此例程將返回空字符串。
  • std::string root_name( ):在給定從文件系統根目錄開始的路徑的情況下,此例程將返回包含 PATHNAME 的第一個字符的字符串。
  • std::string leaf( ):在給定絕對路徑名稱(例如,/home/user1/file2)的情況下,此例程將提供與文件名稱對應的字符串(即 file2)。
  • std::string branch_path( ):這是與?leaf?互補的例程。在給定路徑的情況下,將會返回其構造所用的所有元素(除了最后一個元素)。例如,對于使用?/a/b/c?初始化的 path,path.branch_path( )?將返回?/a/b。對于包含單個元素的路徑,如?c,此例程將返回空字符串。
  • bool empty( ):如果 path 對象包含空字符串(例如?path path1("")),則此例程將返回 True。
  • boost::filesystem::path::iterator:此例程用于遍歷 path 的各個元素。請看清單 5?所示的代碼。
    清單 5. 使用 path::iterator(begin 和 end 接口)
    #include <iostream> #include “boost/filesystem.hpp” int main(){boost::filesystem::path path1("/usr/local/include"); // random pathnameboost::filesystem::path::iterator pathI = path1.begin();while (pathI != path1.end()){std::cout << *pathI << std::endl;++pathI;}return 0;}// result: 1

    上述程序的輸出依次是?/、usr、local、include,代表了該目錄的層次結構。

  • path operator / (char* lhs, const path& rhs):此例程是?path?的非成員函數。它將返回使用?lhs?和?rhs?形成的路徑的串聯值。它將自動插入?/?作為路徑分隔符,如清單 6?中所示。
    清單 6. 路徑字符串的串聯
    #include <iostream> #include “boost/filesystem.hpp” int main(){boost::filesystem::path path1("/usr/local/include"); // random pathnameboost::filesystem::path::iterator pathI = path1.begin();while (pathI != path1.end()){std::cout << *pathI << std::endl;++pathI;}return 0;}// result: 1

錯誤處理

文件系統操作經常遇到意外的問題,Boost Filesystem Library 將使用?C++?異常報告運行時錯誤。boost::filesystem_error?類派生自std::runtime_error?類。庫中的函數使用?filesystem_error?異常報告操作錯誤。與不同的可能錯誤類型對應,Boost 頭文件定義了相應的錯誤代碼。用戶代碼通常駐留在?try...catch?塊內,使用?filesystem_error?異常來報告相關錯誤消息。清單 7?提供了重命名文件的小示例,在?from?路徑中的文件不存在時引發異常。

清單 7. Boost 中的錯誤處理
#include <iostream> #include “boost/filesystem.hpp” int main(){try {boost::filesystem::path path("C:\\src\\hdbase\\j1"); boost::filesystem::path path2("C:\\src\\hdbase\\j2"); boost::filesystem::rename(path, path2);}catch(boost::filesystem::filesystem_error e) { // do the needful } return 0;}

Boost Filesystem Library 中的函數類別

boost::filesystem?提供了不同類別的函數:有些函數(如?is_directory)用于查詢文件系統,而其他函數(如?create_directory)則主動對文件系統進行修改。根據各自功能的不同,這些函數可以大略歸入以下類別:

  • 屬性函數:提供雜項信息,如文件大小、磁盤使用量等。
  • 文件系統操作函數:用于創建常規文件、目錄和符號鏈接;復制和重命名文件;提供刪除功能。
  • 實用工具:測試文件的擴展名等。
  • 雜項常規函數:以編程方式更改文件擴展名等。

屬性函數

Boost Filesystem Library 包括以下屬性函數:

  • uintmax_t file_size(const path&):返回常規文件的大小(以字節為單位)
  • boost::filesystem::space_info space(const path&):接受路徑作為輸入,并返回定義如下的?space_info?結構: struct space_info { uintmax_t capacity;uintmax_t free;uintmax_t available; };

    根據文件系統所屬的磁盤分區,此流程將對該分區的所有目錄返回相同的磁盤使用量統計數據(以字節為單位)。例如,對于 C:\src\dir1 和 C:\src\dir2,都會返回相同的磁盤使用數據。

  • std::time_t last_write_time(const path&):返回文件的最后修改時間。
  • void last_write_time(const path&, std::time_t new_time):修改文件的最后修改時間。
  • const path& current_path( ):返回程序的當前工作目錄的完整路徑(注意,此路徑與最初運行程序的路徑可能不同,因為可能采用編程方式更改目錄)。

文件系統操作函數

這組函數負責進行新文件和目錄創建、文件刪除等操作:

  • bool create_directory(const path&):此函數使用給定的路徑名稱創建目錄。(請注意,如果 PATHNAME 本身包含無效字符,則結果經常是由平臺定義的。例如,在 UNIX 和 Windows 系統中,星號 (*)、問號 (?) 及其他此類字符視為無效,不能出現在目錄名稱中。)
  • bool create_directories(const path&):與創建單個目錄相對,您可以使用此 API 創建目錄樹。例如,以目錄樹 /a/b/c 為例,必須在 /tmp 文件夾內創建此目錄樹。可調用此 API 完成任務,但使用相同的參數調用?create_directory?時將引發異常。
  • bool create_hard_link (const path& frompath, const path& topath):此函數在?frompath?和?topath?間創建硬鏈接。
  • bool create_symlink(const path& frompath, const path& topath):此函數在?frompath?和?topath?間創建符號(軟)鏈接。
  • void copy_file(const path& frompath, const path& topath):將?frompath?引用的文件的內容和屬性復制到?topath?引用的文件中。例程expects a destination file to be absent;如果存在目標文件,則會引發異常。因此,此函數與 UNIX 中系統指定的?cp?命令并不等效。另外,此函數還預期?frompath?變量將引用正確的常規文件。請看以下示例:frompath?引用符號鏈接 /tmp/file1,而后者反過來引用文件 /tmp/file2;而?topath?可以為 /tmp/file3。在這種情況下,copy_file?將失敗。這是此 API 與?cp?命令相比的另一個差別。
  • void rename(const path& frompath, const path& topath):此函數是用于重命名文件的 API。可以通過在?topath?參數中指定完整路徑名來同時重命名和更改文件的位置,如清單 8?中所示。
    清單 8. Boost 中的重命名功能
    #include <stdio.h> #include “boost/filesystem.hpp” int main(){boost::filesystem::path path("/home/user1/abc"); boost::filesystem::rename(path, "/tmp/def"); return 0;}// abc is renamed def and moved to /tmp folder
  • bool remove(const path& p):此例程將嘗試刪除路徑?p?所引用的文件或目錄。對于目錄的情況,如果目錄的內容不為空,則此例程將引發異常。警告:此例程并不考慮所刪除的內容,即使其他程序在訪問同一文件也如此!
  • unsigned long remove_all(const path& p):此 API 嘗試刪除路徑?p?所引用的文件或目錄。與?remove?不同,此函數并不會特殊考慮不為空的目錄。此函數是 UNIX?rm –rf?命令的 Boost 對等項。

實用工具

Boost Filesystem Library 包含以下實用工具:

  • bool exists(const path&):此函數檢查文件的擴展名。文件可以為任何類型:常規文件、目錄、符號鏈接等等。
  • bool is_directory(const path&):此函數檢查路徑是否與目錄對應。
  • bool is_regular(const path&):此函數檢查普通文件(即此文件不是目錄、符號鏈接、套接字或設備文件)。
  • bool is_other(const path&):通常,此函數檢查設備文件(如 /dev/tty0)或套接字文件。
  • bool is_empty(const path&):如果路徑與文件夾對應,此函數將檢查文件夾是否為空,并據此返回“True”或“False”。如果路徑與文件對應,此函數將檢查文件的大小是否等于 0。對于文件的硬鏈接或符號鏈接的情況,此 API 將檢查原始文件是否為空。
  • bool equivalent(const path1& p1, const path2& p2):此 API 非常實用,可用于比較相對路徑和絕對路徑名。請看清單 9:
    清單 9. 測試兩個路徑是否等效
    #include <stdio.h> #include “boost/filesystem.hpp” int main(){boost::filesystem::path path1("/usr/local/include"); // random pathnameboost::filesystem::path path2("/tmp/../usr/local/include");bool result = boost::filesystem::is_equivalent(path1, path2); printf(“Paths are equivalent : %d\n”, result);return 0;}// result: 1
  • path system_complete(const path&):此函數是與?bool equivalent(const path1& p1, const path2& p2)?同一系列的另一個 API。在給定當前工作目錄中任意文件路徑的情況下,此 API 將返回該文件的絕對路徑。例如,如果用戶位于目錄 /home/user1 并查詢文件 ../user2/file2,此函數將返回?/home/user2/file2,即文件 file2 的完整路徑名。

雜項函數

Boost Filesystem Library 包括以下雜項函數:

  • std::string extension(const path&):此函數以前面帶句點 (.) 的形式返回給定文件名的擴展名。例如,對于文件名為?test.cpp?的文件,extension?將返回?.cpp。對于文件沒有擴展名的情況,此函數將返回空字符串。對于隱藏文件(即 UNIX 系統中文件名以?.?開始的文件),此函數將相應地計算擴展名類型或返回空字符串(因此,對于?.test.profile,此例程將返回?.profile)。
  • std::string basename(const path&):這是與?extension?互補的例程。它將返回文件名中?.?之前的字符串。請注意,即使提供了絕對文件名,此 API 仍然僅會返回屬于文件名的直接部分,如清單 10?中所示。
    清單 10. 使用 boost::basename
    #include <stdio.h> #include <cstring> #include “boost/filesystem.hpp” use namespace std; int main(){boost::filesystem::path path1("/tmp/dir1/test1.c "); boost::filesystem::path path2("/tmp/dir1/.test1.profile");string result1 = boost::filesystem::basename (path1); string result2 = boost::filesystem::basename (path2);printf(“Basename 1: %s Basename2 : %s\n”, result1.c_str(), result2.c_str());return 0;}// result: Basename1: test1 Basename2: .test1
  • std::string change_extension(const path& oldpath, const std::string new_extension):此 API 將返回反映更改后的名稱的新字符串。請注意,與?oldpath?對應的文件保持不變。這只是一個常規函數。另請注意,您必須顯式地在擴展名中指定。例如,change_extension("test.c", "so")?會得到?testso,而不是?test.so。

結束語

本文提供了 Boost Filesystem Library 的簡單概述。不應將本文視為 Boost 中的整個文件系統接口的綜合文檔。并未討論此 API 集的內部情況,也沒有討論這些 API 在非 UNIX 或 Windows 平臺(如 VMS)中的細節。有關文件系統的更多信息,請參見參考資料。


from;?http://www.ibm.com/developerworks/cn/aix/library/au-boostfs/

總結

以上是生活随笔為你收集整理的了解 Boost Filesystem Library文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 蜜桃综合网 | 五色天婷婷 | 亚洲欧美日韩在线一区二区 | 久久久久久天堂 | 高清一区二区 | 国产精品偷伦视频免费观看了 | 丝袜美女被c | 爱啪啪影视 | 五月丁香啪啪 | 成人免费毛片免费 | 亚洲free性xxxx护士白浆 | 探花视频在线版播放免费观看 | 亚洲专区一区二区三区 | 亚洲不卡av一区二区 | 免费a在线观看 | 欧美高清一区 | 欧美精品久久久久久久免费 | 黄色一级毛片 | 国产欧美精品在线 | 综合爱爱网 | 天天干狠狠爱 | 激情开心成人网 | 女同vk| 日日干综合 | 亚洲性网| 91人人爱| 久久久精品国产sm调教网站 | 壮汉被书生c到合不拢腿 | 欧美大黄 | 精品婷婷色一区二区三区蜜桃 | 蜜桃视频久久一区免费观看入口 | 黑人添美女bbb添高潮了 | 日韩色网 | 日老女人视频 | 国产黄色高清 | 久热国产视频 | 动漫一区二区三区 | 国产天堂资源 | 激情视频免费在线观看 | 精品在线观看一区 | 夜夜嗨av一区二区三区网页 | 自拍色图| 欧美精品色婷婷五月综合 | 电影寂寞少女免费观看 | 亚洲人成高清 | a毛片成人 | 人人免费操 | www夜插内射视频网站 | 巨乳女教师的诱惑 | 国产三级精品在线 | 亚洲a v网站 | 91免费高清在线观看 | 亚洲女则毛耸耸bbw 边吃奶边添下面好爽 | 亚洲裸体视频 | 亚洲AV成人无码久久精品巨臀 | 亚洲国产精品女人久久久 | 精品人妻一区二区三区蜜桃 | 91精品综合久久久久久 | 成人在线亚洲 | 欧美一区二区三区在线视频 | 国产无遮挡又黄又爽又色 | 午夜日韩 | 在线欧美a | 老狼影院伦理片 | 久久精品大片 | 国产精品va在线 | 国产人成一区二区三区影院 | 黄色免费一级片 | 特级西西人体wwwww | 婷婷一区二区三区四区 | 精品无码人妻一区二区免费蜜桃 | 激情av网站 | 男同互操gay射视频在线看 | 污网站免费在线观看 | 天天摸天天舔天天操 | 日本久久片 | 一区二区三区av | 亚洲制服丝袜一区 | 91精品国产综合久久久密臀九色 | 国产人成视频在线观看 | 黄色一级片在线免费观看 | 日韩欧美色图 | 国产精品xxxxx | 亚洲先锋影音 | sm捆绑调教视频 | 丝袜 中出 制服 人妻 美腿 | 侵犯女教师一区二区三区 | 日韩αv | 五月婷婷六月综合 | 日本黄色性视频 | 开心成人激情 | 婷婷丁香激情五月 | 国产日本亚洲 | 三级精品在线观看 | 亚洲一区二区av | 亚洲AV无码成人片在线观看 | www.在线观看麻豆 | 中文字幕日韩精品无码内射 | 蜜桃视频色 |