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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Boost::filesystem的使用笔记

發(fā)布時(shí)間:2023/12/31 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Boost::filesystem的使用笔记 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Boost::filesystem 使用小筆記

http://blog.csdn.net/dourgulf/article/details/8589207

boost 官方文檔:http://en.highscore.de/cpp/boost/filesystem.html

1. path對(duì)象就是一個(gè)跨平臺(tái)的路徑對(duì)象。有許多方法訪問(wèn)路徑的各個(gè)部分,也用它的iterator迭代路徑中的各個(gè)部分;
???? path構(gòu)造目錄結(jié)構(gòu)的時(shí)候使用“/”運(yùn)算符,非常直觀。
???? 比如path p1;
???? path p2 = p1/"something"; p1 /= "xxx.xxx";

2. filesystem名字空間一下有一些全局的函數(shù),比如exists可以判斷path是不是存在,is_directory函數(shù)判斷是不是目錄,file_size獲得大小--該大小是一個(gè)夸平臺(tái)的類型,可以表示32位或者64的大小;
???? 其他is方法還有:

is_emptyis_otheris_regular_fileis_symlink

3. 最方便的一個(gè)功能是遍歷path里的所有內(nèi)容。directory_iterator。

???? path p;
???? directory_iterator(p)就是迭代器的起點(diǎn),無(wú)參數(shù)的directory_iterator()就是迭代器的終點(diǎn)。

還可以遞歸迭代,把上面的directory_iterator換成recursive_directory_iterator即可。

4. 創(chuàng)建目錄。這里特別要提到一個(gè)方法是bool create_directories(const path& p);? 如果p是一個(gè)目錄(也就是is_diretory返回true)。它會(huì)遞歸的創(chuàng)建整個(gè)目錄結(jié)構(gòu),免去自己一個(gè)一個(gè)創(chuàng)建的煩惱了。

其他創(chuàng)建方法還有:
create_directories create_directory create_hard_link create_symlink
5. 還可以復(fù)制目錄?
copy_directory copy_file copy_symlink

6. 刪除remove 遞歸刪除remove_all


7. 改名字rename


8. 如果包含了<boost/filesystem/fstream.hpp>的話,還可以讓fstream接受path作為參數(shù)。


BTW,使用filesystem需要編譯boost,現(xiàn)在版本只要執(zhí)行一個(gè)腳本就能編譯完成了,比以前方便多了。
不過(guò),還是要提一下Xcode環(huán)境下使用的話,要選擇GCC C++ standard library。


GCC的哭雖然沒(méi)有LLVM 的庫(kù)先進(jìn)(我是說(shuō)支持C++11方面),不過(guò),大部分的C++11標(biāo)準(zhǔn)還是支持的。

目前發(fā)現(xiàn)是GCC的庫(kù)沒(méi)有std::regex。不過(guò),既然用boost的話那就用boost的regex好了。反正std的也是從boost拿過(guò)來(lái)而已。


遺忘的角落的日志 比較詳細(xì)

http://hi.baidu.com/lingyu125/item/7bb0a8cf73a8fe11b77a2460


Boost::fileSystem

ZZ:http://www.ibm.com/developerworks/cn/aix/library/au-boostfs/#resources

對(duì)于 I/O 操作較多的程序,這樣的不一致就意味著需要進(jìn)行大量的工程工作才能在平臺(tái)間移植代碼。正是因?yàn)檫@個(gè)原因,我們才引入了 Boost Filesystem Library。這個(gè)廣泛使用的庫(kù)提供了安全、可移植且易用的C++ 接口,用于執(zhí)行文件系統(tǒng)操作。可以從Boost 站點(diǎn)免費(fèi)下載此庫(kù)。

使用 boost::filesystem 的第一個(gè)程序

在深入研究 Boost Filesystem Library 的更多細(xì)節(jié)之前,請(qǐng)看一下清單 1 中所示的代碼;此代碼使用 Boost API 確定某個(gè)文件的類型是否為 Directory。

#include <stdio.h> #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; }

此代碼非常明了易懂,您并不需要了解任何系統(tǒng)特定的例程。此代碼經(jīng)過(guò)驗(yàn)證,能在不用修改的情況下在 gcc-3.4.4 和 cl-13.10.3077 上成功編譯。

了解 Boost path 對(duì)象

了解 Boost Filesystem Library 的關(guān)鍵是 path 對(duì)象,因?yàn)?Filesystem Library 中定義的多個(gè)例程都要對(duì)相應(yīng)的path 對(duì)象操作。文件系統(tǒng)路徑通常依賴于操作系統(tǒng)。例如,眾所周知,UNIX 和 Linux 系統(tǒng)使用正斜杠 ( /) 字符作為目錄分隔符,而 Windows 將反斜杠 (") 字符用于類似的用途。boost::filesystem::path 旨在準(zhǔn)確地抽象此特性。path 對(duì)象可以通過(guò)多種方式進(jìn)行初始化,最常見的方式是使用char* 或 std::string 進(jìn)行初始化,如清單 2 中所示。


清單 2. 創(chuàng)建 Boost path 對(duì)象的方法
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 對(duì)象時(shí),可以采用本機(jī)格式或可移植操作系統(tǒng)接口(Portable Operating System Interface,POSIX)委員會(huì)定義的可移植格式提供 PATHNAME 變量。這兩種方法在實(shí)際中各有優(yōu)缺點(diǎn)。考慮以下情況:您希望操作軟件所創(chuàng)建的目錄,此目錄在 UNIX 和 Linux 系統(tǒng)上位于 /tmp/mywork,而在 Windows 上位于 C:"tmp"mywork。可以采用多種方法處理問(wèn)題。清單 3 顯示了面向本機(jī)格式的方法。


清單 3. 使用本機(jī)格式初始化 path
#ifdef UNIX boost::filesystem::path path("/tmp/mywork"); #else boost::filesystem::path path("C:""tmp""mywork "); #endif

需要單個(gè) #ifdef 來(lái)按操作系統(tǒng)初始化 path 對(duì)象。不過(guò),如果您喜歡使用可移植格式,請(qǐng)參見清單 4。

清單 4. 使用可移植格式初始化 path
boost::filesystem::path path("/tmp/mywork");

請(qǐng)注意,path::name_check 指的是一個(gè)名稱檢查函數(shù)原型。如果其參數(shù)輸入 PATHNAME 對(duì)于特定的操作系統(tǒng)或文件系統(tǒng)有效,名稱檢查函數(shù)將返回“True”。Boost Filesystem Library 提供了多個(gè)名稱檢查函數(shù),而且也歡迎您提供自己的變體。常用的名稱檢查函數(shù)是 Boost 提供的portable_posix_name 和windows_name。

path 成員函數(shù)概述

path 對(duì)象提供了多個(gè)成員方法。這些成員例程并不會(huì)修改文件系統(tǒng),但會(huì)根據(jù) path 名稱提供有用的信息。此部分提供了其中幾個(gè)例程的概述:

  • const std::string& string( ):此例程會(huì)返回用于初始化 path 的字符串的副本,其格式符合 path 語(yǔ)法規(guī)則。
  • std::string root_directory( ):在提供了路徑的情況下,此 API 將返回根目錄,否則將返回空字符串。例如,如果路徑包含/tmp/var1,則此例程將返回/,即 UNIX 文件系統(tǒng)的根。不過(guò),如果路徑是相對(duì)路徑,如../mywork/bin,此例程將返回空字符串。
  • std::string root_name( ):在給定從文件系統(tǒng)根目錄開始的路徑的情況下,此例程將返回包含 PATHNAME 的第一個(gè)字符的字符串。
  • std::string leaf( ):在給定絕對(duì)路徑名稱(例如,/home/user1/file2)的情況下,此例程將提供與文件名稱對(duì)應(yīng)的字符串(即 file2)。
  • std::string branch_path( ):這是與 leaf 互補(bǔ)的例程。在給定路徑的情況下,將會(huì)返回其構(gòu)造所用的所有元素(除了最后一個(gè)元素)。例如,對(duì)于使用/a/b/c 初始化的 path,path.branch_path( ) 將返回/a/b。對(duì)于包含單個(gè)元素的路徑,如c,此例程將返回空字符串。
  • bool empty( ):如果 path 對(duì)象包含空字符串(例如 path path1("")),則此例程將返回 True。
  • boost::filesystem::path::iterator:此例程用于遍歷 path 的各個(gè)元素。請(qǐng)看清單 5 所示的代碼。

    清單 5. 使用 path::iterator(begin 和 end 接口)
  • #include <iostream> #include “boost/filesystem.hpp” int main() { boost::filesystem::path path1("/usr/local/include"); // random pathname boost::filesystem::path::iterator pathI = path1.begin(); while (pathI != path1.end()) { std::cout << *pathI << std::endl; ++pathI; } return 0; } // result: 1

    上述程序的輸出依次是 /、usr、local、include,代表了該目錄的層次結(jié)構(gòu)。

  • path operator / (char* lhs, const path& rhs):此例程是path 的非成員函數(shù)。它將返回使用lhs 和rhs 形成的路徑的串聯(lián)值。它將自動(dòng)插入/ 作為路徑分隔符,如清單 6 中所示。

    清單 6. 路徑字符串的串聯(lián)
    #include <iostream> #include “boost/filesystem.hpp” int main() { boost::filesystem::path path1("/usr/local/include"); // random pathname boost::filesystem::path::iterator pathI = path1.begin(); while (pathI != path1.end()) { std::cout << *pathI << std::endl; ++pathI; } return 0; } // result: 1

錯(cuò)誤處理

文件系統(tǒng)操作經(jīng)常遇到意外的問(wèn)題,Boost Filesystem Library 將使用 C++ 異常報(bào)告運(yùn)行時(shí)錯(cuò)誤。boost::filesystem_error 類派生自std::runtime_error 類。庫(kù)中的函數(shù)使用filesystem_error 異常報(bào)告操作錯(cuò)誤。與不同的可能錯(cuò)誤類型對(duì)應(yīng),Boost 頭文件定義了相應(yīng)的錯(cuò)誤代碼。用戶代碼通常駐留在try...catch 塊內(nèi),使用filesystem_error 異常來(lái)報(bào)告相關(guān)錯(cuò)誤消息。清單 7 提供了重命名文件的小示例,在from 路徑中的文件不存在時(shí)引發(fā)異常。


清單 7. Boost 中的錯(cuò)誤處理
#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 中的函數(shù)類別boost::filesystem 提供了不同類別的函數(shù):有些函數(shù)(如is_directory)用于查詢文件系統(tǒng),而其他函數(shù)(如create_directory)則主動(dòng)對(duì)文件系統(tǒng)進(jìn)行修改。根據(jù)各自功能的不同,這些函數(shù)可以大略歸入以下類別:

  • 屬性函數(shù):提供雜項(xiàng)信息,如文件大小、磁盤使用量等。
  • 文件系統(tǒng)操作函數(shù):用于創(chuàng)建常規(guī)文件、目錄和符號(hào)鏈接;復(fù)制和重命名文件;提供刪除功能。
  • 實(shí)用工具:測(cè)試文件的擴(kuò)展名等。
  • 雜項(xiàng)常規(guī)函數(shù):以編程方式更改文件擴(kuò)展名等。

屬性函數(shù)

Boost Filesystem Library 包括以下屬性函數(shù):

  • uintmax_t file_size(const path&):返回常規(guī)文件的大小(以字節(jié)為單位)
  • boost::filesystem::space_info space(const path&):接受路徑作為輸入,并返回定義如下的space_info 結(jié)構(gòu): struct space_info {
    uintmax_t capacity;
    uintmax_t free;
    uintmax_t available;
    }; 根據(jù)文件系統(tǒng)所屬的磁盤分區(qū),此流程將對(duì)該分區(qū)的所有目錄返回相同的磁盤使用量統(tǒng)計(jì)數(shù)據(jù)(以字節(jié)為單位)。例如,對(duì)于 C:"src"dir1 和 C:"src"dir2,都會(huì)返回相同的磁盤使用數(shù)據(jù)。
  • std::time_t last_write_time(const path&):返回文件的最后修改時(shí)間。
  • void last_write_time(const path&, std::time_t new_time):修改文件的最后修改時(shí)間。
  • const path& current_path( ):返回程序的當(dāng)前工作目錄的完整路徑(注意,此路徑與最初運(yùn)行程序的路徑可能不同,因?yàn)榭赡懿捎镁幊谭绞礁哪夸?#xff09;。

文件系統(tǒng)操作函數(shù)

這組函數(shù)負(fù)責(zé)進(jìn)行新文件和目錄創(chuàng)建、文件刪除等操作:

  • bool create_directory(const path&):此函數(shù)使用給定的路徑名稱創(chuàng)建目錄。(請(qǐng)注意,如果 PATHNAME 本身包含無(wú)效字符,則結(jié)果經(jīng)常是由平臺(tái)定義的。例如,在 UNIX 和 Windows 系統(tǒng)中,星號(hào) (*)、問(wèn)號(hào) (?) 及其他此類字符視為無(wú)效,不能出現(xiàn)在目錄名稱中。)
  • bool create_directories(const path&):與創(chuàng)建單個(gè)目錄相對(duì),您可以使用此 API 創(chuàng)建目錄樹。例如,以目錄樹 /a/b/c 為例,必須在 /tmp 文件夾內(nèi)創(chuàng)建此目錄樹。可調(diào)用此 API 完成任務(wù),但使用相同的參數(shù)調(diào)用create_directory 時(shí)將引發(fā)異常。
  • bool create_hard_link (const path& frompath, const path& topath):此函數(shù)在frompath 和topath 間創(chuàng)建硬鏈接。
  • bool create_symlink(const path& frompath, const path& topath):此函數(shù)在frompath 和topath 間創(chuàng)建符號(hào)(軟)鏈接。
  • void copy_file(const path& frompath, const path& topath):將frompath 引用的文件的內(nèi)容和屬性復(fù)制到topath 引用的文件中。例程expects a destination file to be absent;如果存在目標(biāo)文件,則會(huì)引發(fā)異常。因此,此函數(shù)與 UNIX 中系統(tǒng)指定的cp 命令并不等效。另外,此函數(shù)還預(yù)期frompath 變量將引用正確的常規(guī)文件。請(qǐng)看以下示例:frompath 引用符號(hào)鏈接 /tmp/file1,而后者反過(guò)來(lái)引用文件 /tmp/file2;而topath 可以為 /tmp/file3。在這種情況下,copy_file 將失敗。這是此 API 與cp 命令相比的另一個(gè)差別。
  • void rename(const path& frompath, const path& topath):此函數(shù)是用于重命名文件的 API。可以通過(guò)在topath 參數(shù)中指定完整路徑名來(lái)同時(shí)重命名和更改文件的位置,如清單 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 所引用的文件或目錄。對(duì)于目錄的情況,如果目錄的內(nèi)容不為空,則此例程將引發(fā)異常。警告:此例程并不考慮所刪除的內(nèi)容,即使其他程序在訪問(wèn)同一文件也如此!
  • unsigned long remove_all(const path& p):此 API 嘗試刪除路徑p 所引用的文件或目錄。與remove 不同,此函數(shù)并不會(huì)特殊考慮不為空的目錄。此函數(shù)是 UNIXrm –rf 命令的 Boost 對(duì)等項(xiàng)。

實(shí)用工具

Boost Filesystem Library 包含以下實(shí)用工具:

  • bool exists(const path&):此函數(shù)檢查文件的擴(kuò)展名。文件可以為任何類型:常規(guī)文件、目錄、符號(hào)鏈接等等。
  • bool is_directory(const path&):此函數(shù)檢查路徑是否與目錄對(duì)應(yīng)。
  • bool is_regular(const path&):此函數(shù)檢查普通文件(即此文件不是目錄、符號(hào)鏈接、套接字或設(shè)備文件)。
  • bool is_other(const path&):通常,此函數(shù)檢查設(shè)備文件(如 /dev/tty0)或套接字文件。
  • bool is_empty(const path&):如果路徑與文件夾對(duì)應(yīng),此函數(shù)將檢查文件夾是否為空,并據(jù)此返回“True”或“False”。如果路徑與文件對(duì)應(yīng),此函數(shù)將檢查文件的大小是否等于 0。對(duì)于文件的硬鏈接或符號(hào)鏈接的情況,此 API 將檢查原始文件是否為空。
  • bool equivalent(const path1& p1, const path2& p2):此 API 非常實(shí)用,可用于比較相對(duì)路徑和絕對(duì)路徑名。請(qǐng)看清單 9:

    清單 9. 測(cè)試兩個(gè)路徑是否等效
    #include <stdio.h> #include “boost/filesystem.hpp” int main() { boost::filesystem::path path1("/usr/local/include"); // random pathname boost::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&):此函數(shù)是與 bool equivalent(const path1& p1, const path2& p2) 同一系列的另一個(gè) API。在給定當(dāng)前工作目錄中任意文件路徑的情況下,此 API 將返回該文件的絕對(duì)路徑。例如,如果用戶位于目錄 /home/user1 并查詢文件 ../user2/file2,此函數(shù)將返回/home/user2/file2,即文件 file2 的完整路徑名。

雜項(xiàng)函數(shù)

Boost Filesystem Library 包括以下雜項(xiàng)函數(shù):

  • std::string extension(const path&):此函數(shù)以前面帶句點(diǎn) (.) 的形式返回給定文件名的擴(kuò)展名。例如,對(duì)于文件名為test.cpp 的文件,extension 將返回.cpp。對(duì)于文件沒(méi)有擴(kuò)展名的情況,此函數(shù)將返回空字符串。對(duì)于隱藏文件(即 UNIX 系統(tǒng)中文件名以. 開始的文件),此函數(shù)將相應(yīng)地計(jì)算擴(kuò)展名類型或返回空字符串(因此,對(duì)于.test.profile,此例程將返回.profile)。
  • std::string basename(const path&):這是與 extension 互補(bǔ)的例程。它將返回文件名中. 之前的字符串。請(qǐng)注意,即使提供了絕對(duì)文件名,此 API 仍然僅會(huì)返回屬于文件名的直接部分,如清單 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 將返回反映更改后的名稱的新字符串。請(qǐng)注意,與oldpath 對(duì)應(yīng)的文件保持不變。這只是一個(gè)常規(guī)函數(shù)。另請(qǐng)注意,您必須顯式地在擴(kuò)展名中指定點(diǎn)。例如,change_extension("test.c", "so") 會(huì)得到testso,而不是 test.so。
from the boost.org
ONLY. That may be useful for dealing with legacy compilers or operating systems.

總結(jié)

以上是生活随笔為你收集整理的Boost::filesystem的使用笔记的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产成人精品久久 | 国产视频综合在线 | 日韩欧美激情视频 | 亚洲艹| 噜噜噜在线视频 | 欧美激情在线一区二区 | 日韩在线观看视频免费 | 在线观看的av网址 | 日韩在线三级 | 免费无码不卡视频在线观看 | 99免费国产| 黄色电影在线视频 | 国产一级一区 | 成人香蕉视频 | 国产激情网| 欧美性一区二区 | 就要日就要操 | 白嫩情侣偷拍呻吟刺激 | 自拍偷拍亚洲区 | 国产成人三级在线 | 蜜臀av一区二区三区有限公司 | 韩国三级在线播放 | 亚洲精品三 | 蜜臀aⅴ国产精品久久久国产老师 | 国产综合精品一区二区三区 | 狠狠干狠狠爱 | 又大又长粗又爽又黄少妇视频 | 伊人网大香 | 69精品视频 | 亚洲激情av| 日本国产一级片 | 亚洲成av | 污片网站| 亚洲色p| 黄色av小说在线观看 | 四虎三级 | 国产精品色婷婷99久久精品 | 男女午夜视频 | 国产精品久久婷婷六月丁香 | 欧美成人久久 | 色午夜| 欧美国产日韩在线观看 | 亚洲精品久久久久中文字幕二区 | 久久99婷婷 | 国产成人一区二区三区电影 | 九九热精品视频在线播放 | 日本护士╳╳╳hd少妇 | 国产亚洲精品女人久久久久久 | 尤物最新网址 | 日韩最新av | 后进极品美女白嫩翘臀 | 精品在线一区二区三区 | 亚洲综合激情小说 | 91视频播放 | 亚洲性猛交 | 精品在线视频一区 | 国产精品果冻传媒潘 | 免费毛片视频 | 99久久久久成人国产免费 | 四虎网站最新网址 | 欧美三级久久久 | www.99视频| 中国三级视频 | 欲求不满在线小早川怜子 | 午夜精品导航 | av在线免播放器 | 精品国产乱 | 欧美日韩免费网站 | 亚洲人性生活视频 | 日韩av男人的天堂 | xxxxwww国产| 少妇又色又紧又黄又刺激免费 | 亚洲国产av一区二区三区 | 久久精品欧美一区二区三区不卡 | 国产亚洲精品久久久久久久久动漫 | 夜夜爽夜夜叫夜夜高潮漏水 | 久久超级碰碰 | 久久久免费毛片 | 四虎永久在线视频 | 国产成人久久婷婷精品流白浆 | 久久久久久夜 | 免费在线观看黄色av | 四虎免费在线观看 | 日本美女视频 | 亚洲欧美日本国产 | 男人天堂久久久 | 日韩在线二区 | av色图片 | 欧美一区二区视频在线观看 | 久久成人一区 | 97国产精品 | 97视频在线观看免费 | 久久精品免费电影 | 欧美一级免费在线 | 欧美成人乱码一区二区三区 | 国产乱码精品一区二区三区不卡 | 精品在线第一页 | 欧美精品日韩 | 一区二区高清在线 |