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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 利用boost 实现文件操作

發布時間:2025/3/21 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++ 利用boost 实现文件操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?對文件夾里面的文件進行遍歷操作是基本技能之一,python,perl以及bash等腳本都很好的實現了文件遍歷方法,對于c/c++來說,只能通過系統自定的api獲取。雖然文件夾操作本身是調用操作系統內核的接口,但畢竟接口不夠友好。

? ? ? ?boost不愧是準標準庫,filesystem提供了極為簡便的方法,如下所示:

[cpp] view plaincopyprint?
  • //??filesystem?tut3.cpp??---------------------------------------------------------------//??
  • ??
  • //??Copyright?Beman?Dawes?2009??
  • ??
  • //??Distributed?under?the?Boost?Software?License,?Version?1.0.??
  • //??See?http://www.boost.org/LICENSE_1_0.txt??
  • ??
  • //??Library?home?page:?http://www.boost.org/libs/filesystem??
  • ??
  • #include?<iostream>??
  • #include?<iterator>??
  • #include?<algorithm>??
  • #include?<boost/filesystem.hpp>??
  • using?namespace?std;??
  • using?namespace?boost::filesystem;??
  • ??
  • int?main(int?argc,?char*?argv[])??
  • {??
  • ??if?(argc?<?2)??
  • ??{??
  • ????cout?<<?"Usage:?tut3?path\n";??
  • ????return?1;??
  • ??}??
  • ??
  • ??path?p?(argv[1]);???//?p?reads?clearer?than?argv[1]?in?the?following?code??
  • ??
  • ??try??
  • ??{??
  • ????if?(exists(p))????//?does?p?actually?exist???
  • ????{??
  • ??????if?(is_regular_file(p))????????//?is?p?a?regular?file???
  • ????????cout?<<?p?<<?"?size?is?"?<<?file_size(p)?<<?'\n';??
  • ??
  • ??????else?if?(is_directory(p))??????//?is?p?a?directory???
  • ??????{??
  • ????????cout?<<?p?<<?"?is?a?directory?containing:\n";??
  • ??
  • ????????copy(directory_iterator(p),?directory_iterator(),??//?directory_iterator::value_type??
  • ??????????ostream_iterator<directory_entry>(cout,?"\n"));??//?is?directory_entry,?which?is??
  • ???????????????????????????????????????????????????????????//?converted?to?a?path?by?the??
  • ???????????????????????????????????????????????????????????//?path?stream?inserter??
  • ??????}??
  • ??????else??
  • ????????cout?<<?p?<<?"?exists,?but?is?neither?a?regular?file?nor?a?directory\n";??
  • ????}??
  • ????else??
  • ??????cout?<<?p?<<?"?does?not?exist\n";??
  • ??}??
  • ??
  • ??catch?(const?filesystem_error&?ex)??
  • ??{??
  • ????cout?<<?ex.what()?<<?'\n';??
  • ??}??
  • ??
  • ??return?0;??
  • }??
  • 然而,每次寫程序都要附上如此一大篇代碼,很不美觀。故作了簡單封裝。

    .h文件

    [cpp] view plaincopyprint?
  • #ifndef?DIRFILEOPT_HHHH??
  • #define?DIRFILEOPT_HHHH??
  • ??
  • #include?<iostream>??
  • #include?<vector>??
  • #include?<string>??
  • ??
  • using?std::vector;??
  • using?std::string;??
  • ??
  • class?CFileOpt??
  • {??
  • private:??
  • ????bool?m_bIsDir;??
  • ????bool?m_bIsFile;??
  • ????char*?m_pFileName;??
  • ????bool?mDirOrFile();??
  • ??
  • public:??
  • ????CFileOpt(char*);??
  • ????vector<string>&?mGetSubFiles(vector<string>&?lstpFileNames);??
  • ????~CFileOpt();??
  • };#endif??
  • .cpp文件[cpp] view plaincopyprint?
  • #define?_SCL_SECURE_NO_WARNINGS??
  • #include?"FileOpt.h"??
  • #include?<iterator>??
  • #include?<algorithm>??
  • #include?<boost/filesystem.hpp>??
  • #include?<boost/algorithm/string/classification.hpp>??
  • #include?<boost/algorithm/string.hpp>??
  • using?namespace?std;??
  • using?namespace?boost::filesystem;??
  • ??
  • bool?CFileOpt::mDirOrFile()??
  • {??
  • ????if(NULL?==?m_pFileName)??
  • ????????return?false;??
  • ????path?p(m_pFileName);??
  • ????try{??
  • ????????if(exists(p)){?????
  • ????????????if?(is_regular_file(p))?????????
  • ????????????????m_bIsFile?=?true;?????????????
  • ????????????else?if?(is_directory(p)){??
  • ????????????????m_bIsDir?=?true;??
  • ????????????}??
  • ????????}else{??
  • ????????????return?false;??
  • ????????}??
  • ????}catch?(const?filesystem_error&?ex){??
  • #ifdef?DEBUG??
  • ????????printf(ex.what());??
  • #endif??
  • ????}??
  • ????return?true;??
  • }??
  • CFileOpt::CFileOpt(char*?pfilename):??
  • ????m_pFileName(pfilename),m_bIsDir(false),m_bIsFile(false){??
  • ????????mDirOrFile();??
  • }??
  • vector<string>&?CFileOpt::mGetSubFiles(vector<string>&?lstpFileNames)??
  • {??
  • ????if(m_bIsDir){??
  • ????????path?p(m_pFileName);??
  • ????????typedef?vector<path>?vec;?????????????//?store?paths,??
  • ????????vec?pathes;??
  • #ifdef?DEBUG??
  • ????copy(directory_iterator(p),?directory_iterator(),ostream_iterator<directory_entry>(cout,"\n"));??
  • #endif??
  • ????????copy(directory_iterator(p),?directory_iterator(),?back_inserter(pathes));??
  • ????????for(auto?iter?=?pathes.begin();iter?!=?pathes.end();iter?++){??
  • ????????????lstpFileNames.push_back(iter->generic_string());??
  • ????????}??
  • ????????return?lstpFileNames;??
  • ????}else{??
  • #ifdef?DEBUG??
  • ????????printf("No?SubFiles?In?%s\n",m_pFileName);??
  • #endif??
  • ????}??
  • ????return?lstpFileNames;??
  • }??
  • CFileOpt::~CFileOpt(){??
  • ????m_pFileName?=?NULL;??
  • }??
  • 調用構造函數,傳入文件夾的名字,通過mGetSubFiles()函數就可以返回文件夾內的文件路徑。

    總結

    以上是生活随笔為你收集整理的c++ 利用boost 实现文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。

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