freecplus框架-目錄操做

1、源代碼說明

freecplus是一個Linux系統下的C/C++開源框架,源代碼請前往C語言技術網(www.freecplus.net)下載。框架

本文介紹的是freecplus框架的目錄操做函數和類。ide

函數和類的聲明文件是freecplus/_freecplus.h。函數

函數和類的定義文件是freecplus/_freecplus.cpp。測試

示例程序位於freecplus/demo目錄中。.net

編譯規則文件是freecplus/demo/makefile。code

2、建立目錄

在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"目錄。
}

3、獲取目錄下的文件信息

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容器進行排序,排序會消耗資源和時間,能夠不排序就不排序。

4、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、做者和原文的連接。
來源:C語言技術網(www.freecplus.net)
做者:碼農有道

若是這篇文章對您有幫助,請點贊支持,或在您的博客中轉發個人文章,謝謝!!!若是文章有錯別字,或者內容有錯誤,或其餘的建議和意見,請您留言指正,很是感謝!!!

相關文章
相關標籤/搜索