freecplus是一個Linux系統下的C/C++開源框架,源代碼請前往C語言技術網(www.freecplus.net)下載。框架
本文介紹的是freecplus框架的目錄操做函數和類。ide
函數和類的聲明文件是freecplus/_freecplus.h。函數
函數和類的定義文件是freecplus/_freecplus.cpp。測試
示例程序位於freecplus/demo目錄中。.net
編譯規則文件是freecplus/demo/makefile。code
在Linux下,若是想建立一個"/tmp/aaa/bbb/ccc/ddd/data.xml"的文件,必須先建立"/tmp/aaa/bbb/ccc/ddd",步驟以下:xml
1)若是"/tmp"目錄不存在,建立"/tmp"。blog
2)若是"/tmp/aaa"目錄不存在,建立"/tmp/aaa"。排序
3)若是"/tmp/aaa/bbb"目錄不存在,建立"/tmp/aaa/bbb"。遞歸
4)若是"/tmp/aaa/bbb/ccc"目錄不存在,建立"/tmp/aaa/bbb/ccc"。
5)若是"/tmp/aaa/bbb/ccc/ddd"目錄不存在,建立"/tmp/aaa/bbb/ccc/ddd"。
6)建立"/tmp/aaa/bbb/ccc/ddd/data.xml"文件。
這些操做雖然沒有多少技術含量,但也很煩人。
MKDIR函數根據絕對路徑的文件名或目錄名逐級的建立目錄。
函數聲明:
bool MKDIR(const char *pathorfilename,bool bisfilename=true);
參數說明:
pathorfilename:絕對路徑的文件名或目錄名。
bisfilename:說明pathorfilename的類型,true-pathorfilename是文件名,不然是目錄名,缺省值爲true。
返回值:true-建立成功,false-建立失敗,若是返回失敗,緣由有大概有三種狀況:1)權限不足;2)pathorfilename參數不是合法的文件名或目錄名;3)磁盤空間不足。
示例(demo30.cpp)
/* * 程序名:demo30.cpp,此程序演示freecplus框架中採用MKDIR函數根據絕對路徑的文件名或目錄名逐級的建立目錄。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" int main() { MKDIR("/tmp/aaa/bbb/ccc/ddd",false); // 建立"/tmp/aaa/bbb/ccc/ddd"目錄。 MKDIR("/tmp/111/222/333/444/data.xml",true); // 建立"/tmp/111/222/333/444"目錄。 }
freecplus框架把獲取某目錄及其子目錄中的文件列表信息的功能封裝成CDir類。
類的聲明:
// 獲取某目錄及其子目錄中的文件列表信息。 class CDir { public: char m_DirName[301]; // 目錄名,例如:/tmp/root。 char m_FileName[301]; // 文件名,不包括目錄名,例如:data.xml。 char m_FullFileName[301]; // 文件全名,包括目錄名,例如:/tmp/root/data.xml。 int m_FileSize; // 文件的大小,單位:字節。 char m_ModifyTime[21]; // 文件最後一次被修改的時間,即stat結構體的st_mtime成員。 char m_CreateTime[21]; // 文件生成的時間,即stat結構體的st_ctime成員。 char m_AccessTime[21]; // 文件最後一次被訪問的時間,即stat結構體的st_atime成員。 char m_DateFMT[21]; // 文件時間顯示格式,由SetDateFMT方法設置。 vector<string> m_vFileName; // 存放OpenDir方法獲取到的文件名(文件全名,包括目錄名)列表。 int m_pos; // 已讀取m_vFileName容器的位置,每調用一次ReadDir方法m_pos加1。 CDir(); // 構造函數。 void initdata(); // 初始化成員變量。 // 設置文件時間的格式,支持"yyyy-mm-dd hh24:mi:ss"和"yyyymmddhh24miss"兩種,缺省是前者。 void SetDateFMT(const char *in_DateFMT); // 打開目錄,獲取目錄中的文件列表信息,存放於m_vFileName容器中。 // in_DirName,待打開的目錄名,採用絕對路徑,如/tmp/root。 // in_MatchStr,待獲取文件名的匹配規則,不匹配的文件被忽略。 // in_MaxCount,獲取文件的最大數量,缺省值爲10000個。 // bAndChild,是否打開各級子目錄,缺省值爲false-不打開子目錄。 // bSort,是否對獲取到的文件列表(即m_vFileName容器中的內容)進行排序,缺省值爲false-不排序。 // 返回值:若是in_DirName參數指定的目錄不存在,OpenDir方法會建立該目錄,若是建立失敗,返回false,還有,若是當前用戶對in_DirName目錄下的子目錄沒有讀取權限也會返回false,其它正常狀況下都會返回true。 bool OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount=10000,const bool bAndChild=false,bool bSort=false); // 這是一個遞歸函數,用於OpenDir()的調用,在CDir類的外部不須要調用它。 bool _OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild); // 從m_vFileName容器中獲取一條記錄(文件名),同時獲得該文件的大小、修改時間等信息。 // 調用OpenDir方法時,m_vFileName容器被清空,m_pos歸零,每調用一次ReadDir方法m_pos加1。 // 當m_pos小於m_vFileName.size(),返回true,不然返回false。 bool ReadDir(); ~CDir(); // 析構函數。 };
CDir類的成員變量和函數的說明文字在類的聲明中已詳細描述。
咱們經過一個應用場景來演示CDir類的用法。
先執行如下腳本生成測試目錄和文件。
mkdir /tmp/root mkdir /tmp/root/aaa mkdir /tmp/root/bbb cd freecplus cp freecplus.* /tmp/root/. cp demo/demo1* /tmp/root/aaa/. cp demo/demo2* /tmp/root/bbb/. cp demo/makefile /tmp/root/bbb/.
執行以上腳本後,在/tmp/root目錄中的目錄和文件列表以下:
示例(demo32.cpp)
/* * 程序名:demo32.cpp,此程序演示freecplus框架中採用CDir類獲取某目錄及其子目錄中的文件列表信息。 * 做者:C語言技術網(www.freecplus.net) 日期:20190525 */ #include "../_freecplus.h" int main() { CDir Dir; if (Dir.OpenDir("/tmp/root","*.h,*cpp",100,true,true)==false) { printf("Dir.OpenDir(/tmp/root) failed.\n"); return -1; } while(Dir.ReadDir()==true) { printf("filename=%s,mtime=%s,size=%d\n",Dir.m_FullFileName,Dir.m_ModifyTime,Dir.m_FileSize); } }
運行效果
注意事項:
1)每次調用ReadDir方法後,把CDir類其它成員變量的值輸出到屏幕,觀察運行效果。
2)OpenDir方法的in_MatchStr參數很是重要,在實際開發中應用普遍。
3)若是文件名圓點"."打頭,OpenDir方法將不讀取這些文件,若是您但願讀取這些文件,能夠修改_OpenDir方法中的源代碼。
4)OpendDir方法的in_MaxCount參數設置了每次掃描目錄中的文件數量,建議不超過10000,若是取值過大,打開目錄的時間會比較長,還會消耗比較多的內存。
5)OpenDir的bSort參數設置是否對m_vFileName容器進行排序,排序會消耗資源和時間,能夠不排序就不排序。
C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道
若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!