c++ 利用boost 实现文件操作
生活随笔
收集整理的這篇文章主要介紹了
c++ 利用boost 实现文件操作
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?對文件夾里面的文件進行遍歷操作是基本技能之一,python,perl以及bash等腳本都很好的實現了文件遍歷方法,對于c/c++來說,只能通過系統自定的api獲取。雖然文件夾操作本身是調用操作系統內核的接口,但畢竟接口不夠友好。//??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;?? }??
然而,每次寫程序都要附上如此一大篇代碼,很不美觀。故作了簡單封裝。#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()函數就可以返回文件夾內的文件路徑。
? ? ? ?boost不愧是準標準庫,filesystem提供了極為簡便的方法,如下所示:
[cpp] view plaincopyprint?.h文件
[cpp] view plaincopyprint?總結
以上是生活随笔為你收集整理的c++ 利用boost 实现文件操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c++ 函数返回引用
- 下一篇: c++函数返回值与引用