国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

如何在VB中實(shí)現(xiàn)目錄遍歷

2019-11-18 17:34:46
字體:
供稿:網(wǎng)友
一、API函數(shù)的聲明、自定義數(shù)據(jù)類型及常量的定義
----注意:API函數(shù)的聲明應(yīng)在應(yīng)用程序的代碼模塊中進(jìn)行,且一條聲明必須放在一行中'API函數(shù)的聲明
PublicDeclareFunctionFindFirstFileLib
"kernel32"Alias"FindFirstFileA"
(ByVallpFileNameAsString,
lpFindFileDataAsWIN32_FIND_DATA)AsLong
PublicDeclareFunctionFindNextFileLib
"kernel32"Alias"FindNextFileA"
(ByValhFindFileAsLong,lpFindFileData
AsWIN32_FIND_DATA)AsLong
PublicDeclareFunctionFindCloseLib
"kernel32"(ByValhFindFileAsLong)AsLong

'最大路徑長度和文件屬性常量的定義
PublicConstMAX_PATH=260
PublicConstFILE_ATTRIBUTE_ARCHIVE=&H20
PublicConstFILE_ATTRIBUTE_COMPublicTypeFILETIME
dwLowDateTimeAsLong
dwHighDateTimeAsLong
EndType

PublicTypeWIN32_FIND_DATA
dwFileAttributesAsLong
ftCreationTimeAsFILETIME
ftLast
accessTimeAsFILETIME
ftLastWriteTimeAsFILETIME
nFileSizeHighAsLong
nFileSizeLowAsLong
dwReserved0AsLong
dwReserved1AsLong
cFileNameAsString*MAX_PATH
cAlternateAsString*14
EndType

二、去掉固定長度字符串右邊的NULL字符(ASCII值為0)和SPACE字符(ASCII值為32)
----由于數(shù)據(jù)類型WIN32_FIND_DATA的cFileName元素為定長數(shù)據(jù)類型且在執(zhí)行函數(shù)FindFirstFile和FindNextFile后會有NULL字符,因此需去掉其中的無效字符。
PublicFunctionfDelInvaildChr
(strAsString)AsString
OnErrorResumeNext
Fori=Len(str)To1Step-1
IfAsc(Mid(str,i,1))<>
0AndAsc(Mid(str,i,1))<>32Then
fDelInvaildChr=Left(str,i)
ExitFor
EndIf
Next
EndFunction

三、遍歷主函數(shù)
----參數(shù)說明:
strPathName要遍歷的目錄
objList使用VB的內(nèi)部控
件ListBox來存放遍歷得到的路徑,之所以
不使用字符串?dāng)?shù)組是因?yàn)閿?shù)組大小不好定義

PublicSubsDirTraversal
(ByValstrPathNameAsString,ByRefobjListAsListBox)
DimsSubDir(200)AsString
'存放當(dāng)前目錄下的子目錄,下標(biāo)可根據(jù)需要調(diào)整
DimiIndexAsInteger
'子目錄數(shù)組下標(biāo)
DimiAsInteger
'用于循環(huán)子目錄的查找

DimlHandleAsLong
'FindFirstFileA的句柄
DimtFindDataAsWIN32_FIND_DATA'
DimstrFileNameAsString'文件名

OnErrorResumeNext
'初始化變量
i=1
iIndex=0
tFindData.cFileName=
""'初始化定長字符串

lHandle=FindFirstFile
(strPathName&"/*.*",tFindData)
IflHandle=0Then'查詢結(jié)束或發(fā)生錯(cuò)誤
ExitSub
EndIf
strFileName=fDelInvaildChr(tFindData.cFileName)
IftFindData.dwFileAttributes=&H10Then'目錄
IfstrFileName<>"."AndstrFileName<>".."Then
iIndex=iIndex 1
sSubDir(iIndex)=strPathName
&"/"&strFileName'添加到目錄數(shù)組
EndIf
Else
objList.AddItemstrPathName
&"/"&strFileName
EndIf
'循環(huán)查找下一個(gè)文件,直到結(jié)束
DoWhileTrue
tFindData.cFileName=""
IfFindNextFile(lHandle,tFindData)
=0Then'查詢結(jié)束或發(fā)生錯(cuò)誤
FindClose(lHandle)
ExitDo
Else
strFileName=fDelInvaildChr
(tFindData.cFileName)
IftFindData.dwFileAttributes=&H10Then
IfstrFileName<>"."AndstrFileName<>".."Then
iIndex=iIndex 1
sSubDir(iIndex)=strPathName
&"/"&strFileName'添加到目錄數(shù)組
EndIf
Else
objList.AddItemstrPathName&"/"&strFileName
EndIf
EndIf
Loop
'如果該目錄下有目錄,則根據(jù)目錄數(shù)組遞歸遍歷
IfiIndex>0Then
Fori=1ToiIndex
sDirTraversalsSubDir(i),objList
Next
EndIf
EndSub

----利用以上遍歷方法,讀者可以根據(jù)數(shù)據(jù)類型WIN32_FIND_DATA的dwFileAttributes、ftCreationTime、ftLastAccessTime、ftLastWriteTime元素來擴(kuò)充文件查詢功能(按文件屬性、創(chuàng)建日期、最后修改日期、最后訪問日期等不同條件的查詢)。



完整代碼:

'''''''''''''''''''''''''''''''''''''''''''
'API函數(shù)的聲明、常量、自定義數(shù)據(jù)類型
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'API函數(shù)的聲明
PublicDeclareFunctionFindFirstFileLib"kernel32"Alias"FindFirstFileA"(ByVallpFileNameAsString,lpFindFileDataAsWIN32_FIND_DATA)AsLong
PublicDeclareFunctionFindNextFileLib"kernel32"Alias"FindNextFileA"(ByValhFindFileAsLong,lpFindFileDataAsWIN32_FIND_DATA)AsLong
PublicDeclareFunctionFindCloseLib"kernel32"(ByValhFindFileAsLong)AsLong
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

'最大路徑長度和文件屬性常量的定義
PublicConstMAX_PATH=260
PublicConstFILE_ATTRIBUTE_ARCHIVE=&H20
PublicConstFILE_ATTRIBUTE_COMPRESSED=&H800
PublicConstFILE_ATTRIBUTE_DIRECTORY=&H10
PublicConstFILE_ATTRIBUTE_HIDDEN=&H2
PublicConstFILE_ATTRIBUTE_NORMAL=&H80
PublicConstFILE_ATTRIBUTE_READONLY=&H1
PublicConstFILE_ATTRIBUTE_SYSTEM=&H4
PublicConstFILE_ATTRIBUTE_TEMPORARY=&H100

'自定義數(shù)據(jù)類型FILETIME和WIN32_FIND_DATA的定義
PublicTypeFILETIME
dwLowDateTimeAsLong
dwHighDateTimeAsLong
EndType

PublicTypeWIN32_FIND_DATA
dwFileAttributesAsLong
ftCreationTimeAsFILETIME
ftLastAccessTimeAsFILETIME
ftLastWriteTimeAsFILETIME
nFileSizeHighAsLong
nFileSizeLowAsLong
dwReserved0AsLong
dwReserved1AsLong
cFileNameAsString*MAX_PATH
cAlternateAsString*14
EndType

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'去掉固定長度字符串右邊的NULL字符(ASCII值為0)和SPACE字符(ASCII值為32)函數(shù)
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
PublicFunctionfDelInvaildChr(strAsString)AsString
OnErrorResumeNext
Fori=Len(str)To1Step-1
IfAsc(Mid(str,i,1))<>0AndAsc(Mid(str,i,1))<>32Then
fDelInvaildChr=Left(str,i)
ExitFor
EndIf
Next
EndFunction

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'遍歷主函數(shù)
'參數(shù)說明:
'strPathName要遍歷的目錄
'objList使用VB的內(nèi)部控件ListBox來存放遍歷得到的路徑,之所以
'不使用字符串?dāng)?shù)組是因?yàn)閿?shù)組大小不好定義
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
PublicSubsDirTraversal(ByValstrPathNameAsString,ByRefobjListAsListBox)
DimsSubDir(200)AsString'存放當(dāng)前目錄下的子目錄,下標(biāo)可根據(jù)需要調(diào)整
DimiIndexAsInteger'子目錄數(shù)組下標(biāo)
DimiAsInteger'用于循環(huán)子目錄的查找

DimlHandleAsLong'FindFirstFileA的句柄
DimtFindDataAsWIN32_FIND_DATA'
DimstrFileNameAsString'文件名

OnErrorResumeNext
'初始化變量
i=1
iIndex=0
tFindData.cFileName=""'初始化定長字符串

lHandle=FindFirstFile(strPathName&"/*.*",tFindData)
IflHandle=0Then'查詢結(jié)束或發(fā)生錯(cuò)誤
ExitSub
EndIf
strFileName=fDelInvaildChr(tFindData.cFileName)
IftFindData.dwFileAttributes=&H10Then'目錄
IfstrFileName<>"."AndstrFileName<>".."Then
iIndex=iIndex 1
sSubDir(iIndex)=strPathName&"/"&strFileName'添加到目錄數(shù)組
EndIf
Else
objList.AddItemstrPathName&"/"&strFileName
EndIf
'循環(huán)查找下一個(gè)文件,直到結(jié)束
DoWhileTrue
tFindData.cFileName=""
IfFindNextFile(lHandle,tFindData)=0Then'查詢結(jié)束或發(fā)生錯(cuò)誤
FindClose(lHandle)
ExitDo
Else
strFileName=fDelInvaildChr(tFindData.cFileName)
IftFindData.dwFileAttributes=&H10Then
IfstrFileName<>"."AndstrFileName<>".."Then
iIndex=iIndex 1
sSubDir(iIndex)=strPathName&"/"&strFileName'添加到目錄數(shù)組
EndIf
Else
objList.AddItemstrPathName&"/"&strFileName
EndIf
EndIf
Loop
'如果該目錄下有目錄,則根據(jù)目錄數(shù)組遞歸遍歷
IfiIndex>0Then
Fori=1ToiIndex
sDirTraversalsSubDir(i),objList
Next
EndIf
EndSub->


發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 达州市| 舟山市| 南安市| 新余市| 屏边| 鹤庆县| 宝清县| 海原县| 邹城市| 砀山县| 东明县| 西充县| 镇康县| 浦东新区| 博白县| 温宿县| 咸宁市| 宝山区| 丰台区| 甘南县| 临海市| 平远县| 厦门市| 保山市| 建德市| 岐山县| 镇原县| 孝义市| 霍林郭勒市| 沂水县| 上杭县| 贞丰县| 建始县| 靖安县| 焦作市| 泸州市| 讷河市| 运城市| 鞍山市| 临泽县| 岳阳县|