Win32的資料夾遍歷方法之遞迴寫法

2021-05-24 14:36:27 字數 1405 閱讀 6312

以下是我的演算法偽**: 

void function(lpctstr lpszpath) 

while (查詢下乙個檔案並成功);  } 

實現這個演算法所需要用到的api函式以及結構體有: 

findfirstfile; 

findnextfile; 

win32_find_data。 

在此我假定你已經明白了以上函式及結構體的用法,now let's begin。 

現在我來編寫開始查詢的**。在這之前,我先假定函式引數lpszpath傳入的路徑格式為x:/(根目錄)或x:/dir(非根目錄),因為win32程式設計中通常使用的就是這種路徑格式。你一定注意到了,如果路徑是根目錄,它的後邊有乙個路徑分隔符「/」,反之則沒有。那麼我在寫**的時候必須對這兩種情況分別處理。這段**如下: 

tchar szfind[max_path]; 

lstrcpy(szfind, lpszpath); 

if (!isroot(szfind)) // isroot是我自己編寫的函式,若引數是根目錄,則返回true 

lstrcat(szfind, "//"); 

lstrcat(szfind, "*.*"); // 找所有檔案 

win32_find_data wfd; 

handle hfind = findfirstfile(szfind, &wfd); 

if (hfind == invalid_handle_value) // 如果沒有找到或查詢失敗 

return; 

下面我將討論的是如果找到了檔案,該怎麼辦。不過在此之前,請你進入ms-dos方式,並輸入dir回車,你看到了什麼? 

是的,dos是不會說假話的,不像windows一樣總把重要的東西隱藏起來不讓你看到——如果你所在的不是根目錄,你將會看到「.」與「..」這兩個目錄——這是在資源管理器中看不到的。從dos時代走過的朋友們大抵都明白吧,乙個點代表的是當前目錄,兩個點代表的是上一級目錄。那麼我在處理資訊時,就一定得把它們兩個過濾出去,原因我在下面解釋。do-while段的**如下: 

do   

else   

} while (findnextfile(hfind, &wfd)); 

findclose(hfind); // 關閉查詢控制代碼 

現在我來解釋為什麼要把那兩個帶點的目錄過濾出去。如你所見,如果找到的是目錄,那麼進入此目錄進行遞迴——那麼若是當前目錄呢?答案很明顯,如果不對其進行過濾,那麼程式將進入「當前目錄」進行遞迴。是的,如是將導致遞迴無休止地進行下去。 

演算法就這麼多了,由於這是乙個極其耗費系統資源的演算法,因此你在程式中用到它的時候,最好將其放到乙個單獨的執行緒中執行,否則將會導致你的程式在查詢過程中沒有任何響應。 

附:isroot函式原始碼 

boolisroot(lpctstr lpszpath)   

用遞迴寫Win32的資料夾遍歷

用遞迴寫win32的資料夾遍歷 以下是我的演算法偽 void function lpctstr lpszpath while 查詢下乙個檔案並成功 實現這個演算法所需要用到的api函式以及結構體有 findfirstfile findnextfile win32 find data。在此我假定你已經...

WIN32 C 遍歷資料夾

一 先介紹乙個結構 win32 find data typedef struct win32 find data dword dwfileattributes 檔案屬性 filetime ftcreationtime 檔案建立時間 filetime ftlastaccesstime 檔案最後一次訪問...

WIN32 C 遍歷資料夾

一 先介紹乙個結構 win32 find data typedef struct win32 find data dword dwfileattributes 檔案屬性 filetime ftcreationtime 檔案建立時間 filetime ftlastaccesstime 檔案最後一次訪問...