以下是我的演算法偽**:
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 檔案最後一次訪問...