資料夾遍歷技術是一種非常有用的技術,在檔案的搜尋以及防毒
軟體中都使用了這種技術。以下我將討論如何在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)
遍歷資料夾
function search path string filename string ball boolean false string varsearchrec tsearchrec begin if findfirst path faanyfile,searchrec 0 then begin...
資料夾遍歷
c 遍歷指定資料夾中的所有檔案 directoryinfo thefolder new directoryinfo folderfullname 遍歷一層資料夾 foreach directoryinfo nextfolder in thefolder.getdirectories 遍歷多層資料夾 ...
遍歷資料夾
使用files類的newdirectorystream方法完成這一功能 path path paths.get d test try catch ioexception e files提供了乙個walkfiletree方法,可以用於遍歷整個資料夾,並且針對每個檔案可以進行特定的處理工作。public...