天天看點

VC++周遊目錄

所謂周遊目錄,就是給定一個目錄,通路其中的所有檔案(包括子目錄下的檔案)。疊代是比較常用的周遊算法。本文利用C++面向對象的特性,通過一個類CBrowseDir,對目錄周遊進行了封裝。使用者隻需掌握該類四個成員函數的用法,就可以在自己的程式中,很友善地實作目錄周遊。

  類CBrowseDir使用了疊代算法。因為算法不是本文重點,筆者不打算展開進一步讨論,對其感興趣者可參考相關資料。

一、類成員函數說明:

bool SetInitDir(const char *dir);

  功能:設定要周遊的目錄。

  參數:dir 指向要周遊的目錄,可以使用相對路徑,比如"d:../hawk";還可以使用網絡路徑,比如"//wf/d/hawk"(其中wf是主機名,d是共享目錄,hawk是目錄)。

  傳回值:傳回true,表示設定成功;傳回false,說明目錄不可用。

bool BeginBrowse(const char *filespec);

  功能:開始周遊目錄中由filespec指定的檔案(包括隐藏檔案)。

  參數:filespec 指定檔案類型,可以使用通配符*和?,比如"*.exe"或"a?.*"都是合法參數。注意:filespec中不能包含路徑,象"hawk/*.*"是錯誤的。

  傳回值:函數傳回true,表明已順利周遊完所有檔案;傳回false,周遊過程被使用者中止。

virtual bool ProcessFile(const char *filename);

  功能:虛函數。每找到一個檔案,程式就會調用ProcessFile,并把檔案名作為參數傳遞給函數。如果函數傳回false,則強制周遊中止,并導緻類成員函數函數BeginBrowse傳回false。使用者應該覆寫此函數,以加入自己的處理代碼。

  參數:filename 指向一個檔案名。注意:filename使用絕對路徑。

  傳回值:傳回true,繼續周遊;否則,中止周遊。

virtual void ProcessDir (const char *currentdir,constchar *parentdir);

  功能:虛函數。在周遊過程中,每進入一個子目錄,程式就會調用ProcessDir,并把目錄名及其上一級目錄名作為參數傳遞給函數。如果該目錄是成員函數SetInitDir指定的初始目錄,則parentdir=NULL。使用者可以覆寫此函數,以加入自己的處理代碼。比如可以在這裡統計子目錄的個數。

  參數:currentdir 指向一個子目錄。 

parentdir 指向currentdir的父目錄。 

  注意:currentdir和parentdir均使用絕對路徑。

二、使用:

  把類CBrowseDir的頭檔案BrowseDir.h及實作檔案BrowseDir.cpp加到項目(Project)中,然後派生自己的類并覆寫虛函數ProcessFile和ProcessDir。周遊目錄時,先構造一個派生類對象,用成員函數SetInitDir指定目錄,然後調用BeginBrowse開始周遊。

  本文提供了一個例子 example.cpp,它從CBrowseDir派生出子類CStatDir,通過統計函數ProcessFile及ProcessDir的調用次數,可以得知目錄中的檔案及子目錄個數。程式都有注釋,這裡就不再羅嗦了。

三、注意事項:

1. 類CBrowseDir會改變目前工作目錄。同一個相對路徑,使用CBrowseDir前後,可能會有不同的含義。是以使用者程式設計時,要小心使用相對路徑。

2. 如果項目(Project)是一個MFC應用程式,直接加入BrowseDir.h及BrowseDir.cpp會導緻編譯出錯。這是因為預設情況下,MFC項目使用了預編譯頭(Precompiled Header),而BrowseDir.h和BrowseDir.cpp是用标準C++語句編寫的,沒用預編譯。一個解決辦法是先用類向導生成類CBrowseDir的"架子",再把相應的代碼拷貝過去。

http://blog.csdn.net/khzide/article/details/473763

繼續閱讀