用遞迴寫Win32的資料夾遍歷

2021-04-23 07:19:00 字數 1424 閱讀 6602

用遞迴寫win32的資料夾遍歷

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

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段的**如下:

doelse

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

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

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

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

附:isroot函式原始碼

bool isroot(lpctstr lpszpath)

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

以下是我的演算法偽 void function lpctstr lpszpath while 查詢下乙個檔案並成功 實現這個演算法所需要用到的api函式以及結構體有 findfirstfile findnextfile win32 find data。在此我假定你已經明白了以上函式及結構體的用法,n...

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 檔案最後一次訪問...