關(guān)鍵字/核心提示:[標(biāo)簽:副標(biāo)題]
以下代碼演示了如何用WindowsAPI函數(shù)遍歷指定驅(qū)動(dòng)器、目錄的所有文件。其思路是:調(diào)出瀏覽文件夾窗口讓用戶指定所要搜索的起始路徑,然后用查找文件的API函數(shù)遍歷該目錄下及其包含的子目錄下的所有文件。本例需要:一個(gè)按鈕,一個(gè)TextBox和一個(gè)ListBox,其中,TextBox應(yīng)設(shè)置為多行?! ?..
以下代碼演示了如何用WindowsAPI函數(shù)遍歷指定驅(qū)動(dòng)器、目錄的所有文件。其思路是:調(diào)出瀏覽文件夾窗口讓用戶指定所要搜索的起始路徑,然后用查找文件的API函數(shù)遍歷該目錄下及其包含的子目錄下的所有文件。本例需要:一個(gè)按鈕,一個(gè)TextBox和一個(gè)ListBox,其中,TextBox應(yīng)設(shè)置為多行。
核心代碼參照API-Guide的兩個(gè)例子程序,特此聲明。
OptionExplicit
'查找第一個(gè)文件的API
PrivateDeclareFunctionFindFirstFileLib"kernel32"Alias"FindFirstFileA"(ByVallpFileNameAsString,lpFindFileDataAsWIN32_FIND_DATA)AsLong
'查找下一個(gè)文件的API
PrivateDeclareFunctionFindNextFileLib"kernel32"Alias"FindNextFileA"(ByValhFindFileAsLong,lpFindFileDataAsWIN32_FIND_DATA)AsLong
'獲取文件屬性的API
PrivateDeclareFunctionGetFileAttributesLib"kernel32"Alias"GetFileAttributesA"(ByVallpFileNameAsString)AsLong
'關(guān)閉查找文件的API
PrivateDeclareFunctionFindCloseLib"kernel32"(ByValhFindFileAsLong)AsLong
'以下為調(diào)用瀏覽文件夾窗口的API
PrivateDeclareSubCoTaskMemFreeLib"ole32.dll"(ByValhMemAsLong)
PrivateDeclareFunctionlstrcatLib"kernel32"Alias"lstrcatA"(ByVallpString1AsString,ByVallpString2AsString)AsLong
PrivateDeclareFunctionSHBrowseForFolderLib"shell32"(lpbiAsBrowseInfo)AsLong
PrivateDeclareFunctionSHGetPathFromIDListLib"shell32"(ByValpidListAsLong,ByVallpBufferAsString)AsLong
'常量
ConstMAX_PATH=260
ConstMAXDWORD=&HFFFF
ConstINVALID_HANDLE_VALUE=-1
ConstFILE_ATTRIBUTE_ARCHIVE=&H20
ConstFILE_ATTRIBUTE_DIRECTORY=&H10
ConstFILE_ATTRIBUTE_HIDDEN=&H2
ConstFILE_ATTRIBUTE_NORMAL=&H80
ConstFILE_ATTRIBUTE_READONLY=&H1
ConstFILE_ATTRIBUTE_SYSTEM=&H4
ConstFILE_ATTRIBUTE_TEMPORARY=&H100
ConstBIF_RETURNONLYFSDIRS=1
PrivateTypeFILETIME
dwLowDateTimeAsLong
dwHighDateTimeAsLong
EndType
'定義類(用于查找文件)
PrivateTypeWIN32_FIND_DATA
dwFileAttributesAsLong
ftCreationTimeAsFILETIME
ftLastAccessTimeAsFILETIME
ftLastWriteTimeAsFILETIME
nFileSizeHighAsLong
nFileSizeLowAsLong
dwReserved0AsLong
dwReserved1AsLong
cFileNameAsString*MAX_PATH
cAlternateAsString*14
EndType
'定義類(用于瀏覽文件夾窗口)
PrivateTypeBrowseInfo
hWndOwnerAsLong
pIDLRootAsLong
pszDisplayNameAsLong
lpszTitleAsLong
ulFlagsAsLong
lpfnCallbackAsLong
lParamAsLong
iImageAsLong
EndType
'自定義函數(shù)
FunctionStripNulls(OriginalStrAsString)AsString
If(InStr(OriginalStr,Chr(0))>0)Then
OriginalStr=Left(OriginalStr,InStr(OriginalStr,Chr(0))-1)
EndIf
StripNulls=OriginalStr
EndFunction
'自定義函數(shù)
FunctionFindFilesAPI(pathAsString,SearchStrAsString,FileCountAsInteger,_
DirCountAsInteger)
DimFileNameAsString'文件名
DimDirNameAsString'子目錄名
DimdirNames()AsString'目錄數(shù)組
DimnDirAsInteger'當(dāng)前路徑的目錄數(shù)
DimiAsInteger'循環(huán)計(jì)數(shù)器變量
DimhSearchAsLong'搜索句柄變量
DimWFDAsWIN32_FIND_DATA
DimContAsInteger
IfRight(path,1)<>""Thenpath=path&""
'搜索子目錄
nDir=0
ReDimdirNames(nDir)
Cont=True
hSearch=FindFirstFile(path&"*",WFD)
IfhSearch<>INVALID_HANDLE_VALUEThen
DoWhileCont
DirName=StripNulls(WFD.cFileName)
If(DirName<>".")And(DirName<>"..")Then
IfGetFileAttributes(path&DirName)AndFILE_ATTRIBUTE_DIRECTORYThen
dirNames(nDir)=DirName
DirCount=DirCount1
nDir=nDir1
ReDimPreservedirNames(nDir)
EndIf
EndIf
Cont=FindNextFile(hSearch,WFD)'獲取下一個(gè)子目錄
Loop
Cont=FindClose(hSearch)
EndIf
'遍歷目錄并累計(jì)文件總數(shù)
hSearch=FindFirstFile(path&SearchStr,WFD)
Cont=True
IfhSearch<>INVALID_HANDLE_VALUEThen
WhileCont
FileName=StripNulls(WFD.cFileName)
If(FileName<>".")And(FileName<>"..")Then
FindFilesAPI=FindFilesAPI(WFD.nFileSizeHigh*MAXDWORD)WFD.nFileSizeLow
FileCount=FileCount1
List1.AddItempath&FileName
EndIf
Cont=FindNextFile(hSearch,WFD)'獲取下一個(gè)文件
Wend
Cont=FindClose(hSearch)
EndIf
'假如子目錄存在則遍歷之
IfnDir>0Then
Fori=0TonDir-1
FindFilesAPI=FindFilesAPIFindFilesAPI(path&dirNames(i)&"",_
SearchStr,FileCount,DirCount)
Nexti
EndIf
EndFunction
'查找按鈕代碼
SubCommand1_Click()
DimSearchPathAsString,FindStrAsString
DimFileSizeAsLong
DimNumFilesAsInteger,NumDirsAsInteger
DimiNullAsInteger,lpIDListAsLong,lResultAsLong
DimsPathAsString,udtBIAsBrowseInfo
WithudtBI
'設(shè)置瀏覽窗口
.hWndOwner=Me.hWnd
'返回選中的目錄
.ulFlags=BIF_RETURNONLYFSDIRS
EndWith
'調(diào)出瀏覽窗口
lpIDList=SHBrowseForFolder(udtBI)
IflpIDListThen
sPath=String$(MAX_PATH,0)
'獲取路徑
SHGetPathFromIDListlpIDList,sPath
'釋放內(nèi)存
CoTaskMemFreelpIDList
iNull=InStr(sPath,vbNullChar)
IfiNullThen
sPath=Left$(sPath,iNull-1)
EndIf
EndIf
Screen.MousePointer=vbHourglass
List1.Clear
SearchPath=sPath'選中的目錄為搜索的起始路徑
FindStr="*.*"'搜索所有類型的文件(此處可另作定義)
FileSize=FindFilesAPI(SearchPath,FindStr,NumFiles,NumDirs)
Text1.Text="查找到的文件數(shù):"&NumFiles&vbCrLf&"查找的目錄數(shù):"&_
NumDirs1&vbCrLf&"文件大小總共為:"&vbCrLf&_
Format(FileSize,"#,###,###,##0")&"字節(jié)"
Screen.MousePointer=vbDefault
EndSub->