資料夾遍歷技術

2021-04-14 06:26:53 字數 1541 閱讀 7510

資料夾遍歷技術是一種非常有用的技術,在檔案的搜尋以及防毒

軟體中都使用了這種技術。以下我將討論如何在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...