用遞歸寫Win32的文件夾遍歷
文件夾遍歷技術(shù)是一種非常有用的技術(shù),在文件的搜索以及殺毒軟件中都使用了這種技術(shù)。以下我將討論如何在Win32下實現(xiàn)這種技術(shù)。
文件夾遍歷技術(shù)的核心就是使用遞歸算法,關于遞歸算法,我這里就不多介紹了,不明白的朋友請找出譚先生的《C程序設計》參閱相關內(nèi)容。
以下是我的算法偽代碼:
voidfunction(LPCTSTRlpszPath) |
實現(xiàn)這個算法所需要用到的API函數(shù)以及結(jié)構(gòu)體有:
- FindFirstFile;
- FindNextFile;
- WIN32_FIND_DATA。
在此我假定你已經(jīng)明白了以上函數(shù)及結(jié)構(gòu)體的用法,now let's begin。
現(xiàn)在我來編寫開始查找的代碼。在這之前,我先假定函數(shù)參數(shù)lpszPath傳入的路徑格式為X:(根目錄)或X:Dir(非根目錄),因為Win32程序設計中通常使用的就是這種路徑格式。你一定注意到了,如果路徑是根目錄,它的后邊有一個路徑分隔符“”,反之則沒有。那么我在寫代碼的時候必須對這兩種情況分別處理。這段代碼如下:
TCHARszFind[MAX_PATH]; |
下面我將討論的是如果找到了文件,該怎么辦。不過在此之前,請你進入MS-DOS方式,并輸入dir回車,你看到了什么?
是的,DOS是不會說假話的,不像Windows一樣總把重要的東西隱藏起來不讓你看到——如果你所在的不是根目錄,你將會看到“.”與“..”這兩個目錄——這是在資源管理器中看不到的。從DOS時代走過的朋友們大抵都明白吧,一個點代表的是當前目錄,兩個點代表的是上一級目錄。那么我在處理信息時,就一定得把它們兩個過濾出去,原因我在下面解釋。do-while段的代碼如下:
do |
現(xiàn)在我來解釋為什么要把那兩個帶點的目錄過濾出去。如你所見,如果找到的是目錄,那么進入此目錄進行遞歸——那么若是當前目錄呢?答案很明顯,如果不對其進行過濾,那么程序?qū)⑦M入“當前目錄”進行遞歸。是了,如是將導致遞歸無休止地進行下去。
算法就這么多了,由于這是一個極其耗費系統(tǒng)資源的算法,因此你在程序中用到它的時候,最好將其放到一個單獨的線程中運行,否則將會導致你的程序在查找過程中沒有任何響應。
如果你還有更好的算法,請貼在下面我們一起討論。
附:IsRoot函數(shù)源碼
BOOLIsRoot(LPCTSTRlpszPath) |
版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。