人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

用遞歸寫Win32的文件夾遍歷

發(fā)布日期:2021-12-14 21:43 | 文章來源:源碼中國

文件夾遍歷技術(shù)是一種非常有用的技術(shù),在文件的搜索以及殺毒軟件中都使用了這種技術(shù)。以下我將討論如何在Win32下實現(xiàn)這種技術(shù)。

文件夾遍歷技術(shù)的核心就是使用遞歸算法,關于遞歸算法,我這里就不多介紹了,不明白的朋友請找出譚先生的《C程序設計》參閱相關內(nèi)容。

以下是我的算法偽代碼:

voidfunction(LPCTSTRlpszPath)
{
開始查找;
if(沒有找到文件)
return;
do
{
if(找到的文件是目錄)
function(找到的目錄);
else
對文件進行操作;
}while(查找下一個文件并成功);
}

實現(xiàn)這個算法所需要用到的API函數(shù)以及結(jié)構(gòu)體有:

  • FindFirstFile;
  • FindNextFile;
  • WIN32_FIND_DATA。

在此我假定你已經(jīng)明白了以上函數(shù)及結(jié)構(gòu)體的用法,now let's begin。

現(xiàn)在我來編寫開始查找的代碼。在這之前,我先假定函數(shù)參數(shù)lpszPath傳入的路徑格式為X:(根目錄)或X:Dir(非根目錄),因為Win32程序設計中通常使用的就是這種路徑格式。你一定注意到了,如果路徑是根目錄,它的后邊有一個路徑分隔符“”,反之則沒有。那么我在寫代碼的時候必須對這兩種情況分別處理。這段代碼如下:

TCHARszFind[MAX_PATH];
lstrcpy(szFind,lpszPath);
if(!IsRoot(szFind))//IsRoot是我自己編寫的函數(shù),若參數(shù)是根目錄,則返回true
lstrcat(szFind,"\");
lstrcat(szFind,"*.*");//找所有文件
WIN32_FIND_DATAwfd;
HANDLEhFind=FindFirstFile(szFind,&wfd);
if(INVALID_HANDLE_VALUE==hFind)//如果沒有找到或查找失敗
return;

下面我將討論的是如果找到了文件,該怎么辦。不過在此之前,請你進入MS-DOS方式,并輸入dir回車,你看到了什么?

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

do
{
if(lstrcmp(wfd.cFileName,_T("."))==0||lstrcmp(wfd.cFileName,_T(".."))==0)
continue;//過濾這兩個目錄
if(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
{
TCHARszFile[MAX_PATH];
if(IsRoot(lpszPath))
wsprintf(szFile,"%s%s",lpszPath,wfd.cFileName);
else
wsprintf(szFile,"%s\%s",lpszPath,wfd.cFileName);
function(szFile);//如果找到的是目錄,則進入此目錄進行遞歸
}
else
{
//對文件進行操作
}
}while(FindNextFile(hFind,&wfd));
FindClose( hFind );//關閉查找句柄

現(xiàn)在我來解釋為什么要把那兩個帶點的目錄過濾出去。如你所見,如果找到的是目錄,那么進入此目錄進行遞歸——那么若是當前目錄呢?答案很明顯,如果不對其進行過濾,那么程序?qū)⑦M入“當前目錄”進行遞歸。是了,如是將導致遞歸無休止地進行下去。

算法就這么多了,由于這是一個極其耗費系統(tǒng)資源的算法,因此你在程序中用到它的時候,最好將其放到一個單獨的線程中運行,否則將會導致你的程序在查找過程中沒有任何響應。

如果你還有更好的算法,請貼在下面我們一起討論。

附:IsRoot函數(shù)源碼

BOOLIsRoot(LPCTSTRlpszPath)
{
TCHARszRoot[4];
wsprintf(szRoot,"%c:\",lpszPath[0]);
return(lstrcmp(szRoot,lpszPath)==0);
}

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部