用CFileFind遞迴搜尋目錄

2021-08-25 07:59:06 字數 1389 閱讀 8728

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

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

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

1. 刪除該目錄下的所有檔案

2. 如果該目錄中還有子目錄我們要遞迴地呼叫deletedirectory(lpctstr dirname)函式,以刪除該子目錄下的所有檔案

3. 呼叫removedirectory(lpctstr lppathname)刪除該目錄

deletedirectory(lpctstr dirname)函式的完整實現如下:

bool deletedirectory(lpctstr dirname)

else}}

tempfind.close();

if(!removedirectory(dirname)) file://刪除目錄

return true;

}

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

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

首先,讓使用者指定乙個需要清理的目錄,然後我們通過cfilefind遞迴地遍歷該目錄,查詢目錄名為debug和release的目錄(這是vc預設的輸出目錄,如果你更改了預設設定的話,必須手動刪除之),然後呼叫上面我們編寫的deletedirectory函式刪除之。

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

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

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

總結 遞迴 記憶化搜尋 遞迴

遞迴函式執行時分為函式 前進段和返回段,真正明白並時刻記住這個才真正掌握了遞迴。寫遞迴時三點 開始定義的 引數,結束條件 邊界 若干if語句 遞迴呼叫及 返回段運算 一般引數中總有乙個代表遞迴層數。遞迴結束返回時要考慮是否修改了全域性變數,並將其改回,這個是為回溯做準備。記憶化搜尋 解決了遞迴時大量...

用遞迴如下

1.乙個人趕著鴨子去每個村莊賣,每經過乙個村子賣去所趕鴨子的一半又乙隻。這樣他經過了七個村子後還剩兩隻鴨子,問他出發時共趕多少只鴨子?經過每個村子賣出多少只鴨子?1 題目分析 經過7個村子後還剩下兩隻鴨子,每經過乙個村莊賣當前鴨子的一半加乙隻,所以遞迴出口為經過第七個村子剩下的兩隻,遞迴體為經過下乙...

遞迴與搜尋 一)

最近結束了最令我恐懼的動態規劃,現在一下子就學了遞迴與搜尋,感覺理解起來還是相對於動態規劃而言簡單的,遞迴和搜尋裡面的難點我認為有兩點,遞迴和搜尋都是第一步是找到遞迴和搜尋的實現方程,將一道題目中可以迴圈工作的部分找出來,然後寫出主體的方程,這樣一大部分就可以結束了。但還有乙個難點也是細節的完善,遞...