程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> Visual Basic語言 >> VB綜合教程 >> 如何在VB中實現目錄遍歷

如何在VB中實現目錄遍歷

編輯:VB綜合教程
一、API函數的聲明、自定義數據類型及常量的定義
  ----注意:API函數的聲明應在應用程序的代碼模塊中進行,且一條聲明必須放在一行中'API函數的聲明
  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_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
  
  '自定義數據類型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)
  ----由於數據類型WIN32_FIND_DATA的cFileName元素為定長數據類型且在執行函數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
  
  三、遍歷主函數
  ----參數說明:
  strPathName要遍歷的目錄
  objList使用VB的內部控
  件ListBox來存放遍歷得到的路徑,之所以
  不使用字符串數組是因為數組大小不好定義
  
  PublicSubsDirTraversal
  (ByValstrPathNameAsString,ByRefobjListAsListBox)
  DimsSubDir(200)AsString
  '存放當前目錄下的子目錄,下標可根據需要調整
  DimiIndexAsInteger
  '子目錄數組下標
  DimiAsInteger
  '用於循環子目錄的查找
  
  DimlHandleAsLong
  'FindFirstFileA的句柄
  DimtFindDataAsWIN32_FIND_DATA'
  DimstrFileNameAsString'文件名
  
  OnErrorResumeNext
  '初始化變量
  i=1
  iIndex=0
  tFindData.cFileName=
  ""'初始化定長字符串
  
  lHandle=FindFirstFile
  (strPathName&"*.*",tFindData)
  IflHandle=0Then'查詢結束或發生錯誤
  ExitSub
  EndIf
  strFileName=fDelInvaildChr(tFindData.cFileName)
  IftFindData.dwFileAttributes=&H10Then'目錄
  IfstrFileName<>"."AndstrFileName<>".."Then
  iIndex=iIndex 1
  sSubDir(iIndex)=strPathName
  &""&strFileName'添加到目錄數組
  EndIf
  Else
  objList.AddItemstrPathName
  &""&strFileName
  EndIf
  '循環查找下一個文件,直到結束
  DoWhileTrue
  tFindData.cFileName=""
  IfFindNextFile(lHandle,tFindData)
  =0Then'查詢結束或發生錯誤
  FindClose(lHandle)
  ExitDo
  Else
  strFileName=fDelInvaildChr
  (tFindData.cFileName)
  IftFindData.dwFileAttributes=&H10Then
  IfstrFileName<>"."AndstrFileName<>".."Then
  iIndex=iIndex 1
  sSubDir(iIndex)=strPathName
  &""&strFileName'添加到目錄數組
  EndIf
  Else
  objList.AddItemstrPathName&""&strFileName
  EndIf
  EndIf
  Loop
  '如果該目錄下有目錄,則根據目錄數組遞歸遍歷
  IfiIndex>0Then
  Fori=1ToiIndex
  sDirTraversalsSubDir(i),objList
  Next
  EndIf
  EndSub
  
  ----利用以上遍歷方法,讀者可以根據數據類型WIN32_FIND_DATA的dwFileAttributes、ftCreationTime、ftLastAccessTime、ftLastWriteTime元素來擴充文件查詢功能(按文件屬性、創建日期、最後修改日期、最後訪問日期等不同條件的查詢)。
  
  
  
  完整代碼:
  
  '''''''''''''''''''''''''''''''''''''''''''
  'API函數的聲明、常量、自定義數據類型
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  'API函數的聲明
  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
  
  '自定義數據類型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)函數
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  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
  
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  '遍歷主函數
  '參數說明:
  'strPathName要遍歷的目錄
  'objList使用VB的內部控件ListBox來存放遍歷得到的路徑,之所以
  '不使用字符串數組是因為數組大小不好定義
  ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
  PublicSubsDirTraversal(ByValstrPathNameAsString,ByRefobjListAsListBox)
  DimsSubDir(200)AsString'存放當前目錄下的子目錄,下標可根據需要調整
  DimiIndexAsInteger'子目錄數組下標
  DimiAsInteger'用於循環子目錄的查找
  
  DimlHandleAsLong'FindFirstFileA的句柄
  DimtFindDataAsWIN32_FIND_DATA'
  DimstrFileNameAsString'文件名
  
  OnErrorResumeNext
  '初始化變量
  i=1
  iIndex=0
  tFindData.cFileName=""'初始化定長字符串
  
  lHandle=FindFirstFile(strPathName&"*.*",tFindData)
  IflHandle=0Then'查詢結束或發生錯誤
  ExitSub
  EndIf
  strFileName=fDelInvaildChr(tFindData.cFileName)
  IftFindData.dwFileAttributes=&H10Then'目錄
  IfstrFileName<>"."AndstrFileName<>".."Then
  iIndex=iIndex 1
  sSubDir(iIndex)=strPathName&""&strFileName'添加到目錄數組
  EndIf
  Else
  objList.AddItemstrPathName&""&strFileName
  EndIf
  '循環查找下一個文件,直到結束
  DoWhileTrue
  tFindData.cFileName=""
  IfFindNextFile(lHandle,tFindData)=0Then'查詢結束或發生錯誤
  FindClose(lHandle)
  ExitDo
  Else
  strFileName=fDelInvaildChr(tFindData.cFileName)
  IftFindData.dwFileAttributes=&H10Then
  IfstrFileName<>"."AndstrFileName<>".."Then
  iIndex=iIndex 1
  sSubDir(iIndex)=strPathName&""&strFileName'添加到目錄數組
  EndIf
  Else
  objList.AddItemstrPathName&""&strFileName
  EndIf
  EndIf
  Loop
  '如果該目錄下有目錄,則根據目錄數組遞歸遍歷
  IfiIndex>0Then
  Fori=1ToiIndex
  sDirTraversalsSubDir(i),objList
  Next
  EndIf
  EndSub->

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved