用CfileFind遞歸搜索目錄

 

CfileFind遞歸搜索目錄<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 

 


  我們知道CfileFind未提供直接遍歷其子目錄的功能,而有時候我們卻常常要遍歷某一目錄下的所有文件及其子目錄。如我們要刪除一個目錄,而這個目錄下又有子目錄,因爲Windows不允許刪除非空的目錄,因此我們必須能夠遍歷一個目錄下的所有子目錄,這可以通過簡單的遞歸實現.

  下面讓我們從一個簡單的例子開始:如何刪除某一目錄?(假設我們通過DeleteDirectoryLPCTSTR DirName)函數完成這一功能)

  要刪除一個目錄,我們要完成下面幾步:

  1. 刪除該目錄下的所有文件

  2. 如果該目錄中還有子目錄我們要遞歸地調用DeleteDirectoryLPCTSTR DirName)函數,以刪除該子目錄下的所有文件

  3. 調用RemoveDirectoryLPCTSTR lpPathName)刪除該目錄

DeleteDirectory(LPCTSTR DirName)函數的完整實現如下:
BOOL DeleteDirectory(LPCTSTR DirName)
{
CFileFind tempFind; file://
聲明一個CFileFind類變量,以用來搜索
char tempFileFind[200]; file://
用於定義搜索格式
sprintf(tempFileFind,"%s//*.*",DirName);
file://
匹配格式爲*.*,即該目錄下的所有文件

BOOL IsFinded=(BOOL)tempFind.FindFile(tempFileFind);
file://
查找第一個文件
while(IsFinded)
{
IsFinded=(BOOL)tempFind.FindNextFile(); file://
遞歸搜索其他的文件
if(!tempFind.IsDots()) file://
如果不是"."目錄
{
char foundFileName[200];
strcpy(foundFileName,tempFind.GetFileName().GetBuffer(200));
if(tempFind.IsDirectory()) file://
如果是目錄,則遞歸地調用
{ file://DeleteDirectory
char tempDir[200];
sprintf(tempDir,"%s//%s",DirName,foundFileName);
DeleteDirectory(tempDir);
}
else
{ file://
如果是文件則直接刪除之
char tempFileName[200];
sprintf(tempFileName,"%s//%s",DirName,foundFileName);
DeleteFile(tempFileName);
}
}
}
tempFind.Close();
if(!RemoveDirectory(DirName)) file://
刪除目錄
{
AfxMessageBox("
刪除目錄失敗!",MB_OK);
return FALSE;
}
return TRUE;
}



  通過上面的例子,詳細讀者已學會了如何遞歸遍歷某一目錄下的所有文件及子目錄了。實際上利用這一點可以作出非常有用的工具。下面我給大家舉個小例子。

  用VC編寫程序的時候,VC會生成一大堆的中間文件,這些中間文件的體積十分龐大,一般比我們編寫的代碼要大出10倍以上。當我們想要把我們編寫的源代碼保留起來,以供以後查閱時,我們不得不手動刪除這些中間文件,而有些時候,你想查看以前某個工程的運行結果,於是你編譯該工程,經常這樣做的話,如果你不刪除VC生成的中間文件,你的硬盤很快就會被一大堆的中間文件塞滿。於是我編寫了一個VC的中間文件清理工具。其原理非常簡單:

  首先,讓用戶指定一個需要清理的目錄,然後我們通過CFileFind遞歸地遍歷該目錄,查找目錄名爲DebugRelease的目錄(這是VC默認的輸出目錄,如果你更改了缺省設置的話,必須手動刪除之),然後調用上面我們編寫的DeleteDirectory函數刪除之。

  警告:使用該工具時,一定要確保你的工程沒有叫DebugRelease的,而且你的有用的目錄名也不能是DebugRelease,否則,使用本工具會全部把它們刪掉的。

  另外,本工具也能統計源程序的規模(給出整個工程的行數、c文件數、h文件數和cpp文件數及總的文件數目),你可以用它方便地統計出自己源程序的規模。統計源程序規模的原理也是遞歸地查找某一目錄,其原理和上面講的DeleteDirestory函數是一致的。

  有了該工具你再也不用手動清理自己機子上那一大堆的中間文件了,當你需要把自己的工程目錄保存起來,以供以後查閱時,你就可以通過該工具徹底地清理一下中間文件,平時你再也不用去管那些令人討厭的中間文件了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章