如何運(yùn)用VB.NET API函數(shù)遍歷實(shí)例
VB.NET經(jīng)過長時間的發(fā)展,很多用戶都很了解VB.NET了,這里我來拓展介紹一下VB.NET API函數(shù)的運(yùn)用,讓大家更好的深入了解。
以下代碼演示了如何用Windows VB.NET API函數(shù)遍歷指定驅(qū)動器、目錄的所有文件。其思路是:調(diào)出瀏覽文件夾窗口讓用戶指定所要搜索的起始路徑,然后用查找文件的API函數(shù)遍歷該目錄下及其包含的子目錄下的所有文件。本例需要:一個按鈕,一個TextBox和一個ListBox,其中,TextBox應(yīng)設(shè)置為多行。
核心代碼參照API-Guide的兩個例子程序,特此聲明。 
Option Explicit
- '查找***個文件的API
 - Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA"
 
(ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long- '查找下一個文件的API
 - Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA"
 
(ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long- '獲取文件屬性的API
 - Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA"
 
(ByVal lpFileName As String) As Long- '關(guān)閉查找文件的API
 - Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long
 - '以下為調(diào)用瀏覽文件夾窗口的API
 - Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
 - Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA"
 
(ByVal lpString1 As String, ByVal lpString2 As String) As Long- Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
 - Private Declare Function SHGetPathFromIDList Lib "shell32"
 
(ByVal pidList As Long, ByVal lpBuffer As String) As Long- '常量
 - Const MAX_PATH = 260
 - Const MAXDWORD = &HFFFF
 - Const INVALID_HANDLE_VALUE = -1
 - Const FILE_ATTRIBUTE_ARCHIVE = &H20
 - Const FILE_ATTRIBUTE_DIRECTORY = &H10
 - Const FILE_ATTRIBUTE_HIDDEN = &H2
 - Const FILE_ATTRIBUTE_NORMAL = &H80
 - Const FILE_ATTRIBUTE_READONLY = &H1
 - Const FILE_ATTRIBUTE_SYSTEM = &H4
 - Const FILE_ATTRIBUTE_TEMPORARY = &H100
 - Const BIF_RETURNONLYFSDIRS = 1
 - Private Type FILETIME
 - dwLowDateTime As Long
 - dwHighDateTime As Long
 - End Type
 - '定義類(用于查找文件)
 - Private Type WIN32_FIND_DATA
 - dwFileAttributes As Long
 - ftCreationTime As FILETIME
 - ftLastAccessTime As FILETIME
 - ftLastWriteTime As FILETIME
 - nFileSizeHigh As Long
 - nFileSizeLow As Long
 - dwReserved0 As Long
 - dwReserved1 As Long
 - cFileName As String * MAX_PATH
 - cAlternate As String * 14
 - End Type
 - '定義類(用于瀏覽文件夾窗口)
 - Private Type BrowseInfo
 - hWndOwner As Long
 - pIDLRoot As Long
 - pszDisplayName As Long
 - lpszTitle As Long
 - ulFlags As Long
 - lpfnCallback As Long
 - lParam As Long
 - iImage As Long
 - End Type
 - '自定義函數(shù)
 - Function StripNulls(OriginalStr As String) As String
 - If (InStr(OriginalStr, Chr(0)) > 0) Then
 - OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)
 - End If
 - StripNulls = OriginalStr
 - End Function
 - '自定義函數(shù)
 - Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, _
 - DirCount As Integer)
 - Dim FileName As String ' 文件名
 - Dim DirName As String ' 子目錄名
 - Dim dirNames() As String ' 目錄數(shù)組
 - Dim nDir As Integer ' 當(dāng)前路徑的目錄數(shù)
 - Dim i As Integer ' 循環(huán)計數(shù)器變量
 - Dim hSearch As Long ' 搜索句柄變量
 - Dim WFD As WIN32_FIND_DATA
 - Dim Cont As Integer
 - If Right(path, 1) <> "\" Then pathpath = path & "\"
 - '搜索子目錄
 - nDir = 0
 - ReDim dirNames(nDir)
 - Cont = True
 - hSearch = FindFirstFile(path & "*", WFD)
 - If hSearch <> INVALID_HANDLE_VALUE Then
 - Do While Cont
 - DirName = StripNulls(WFD.cFileName)
 - If (DirName <> ".") And (DirName <> "..") Then
 - If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then
 - dirNames(nDir) = DirName
 - DirCountDirCount = DirCount + 1
 - nDirnDir = nDir + 1
 - ReDim Preserve dirNames(nDir)
 - End If
 - End If
 - Cont = FindNextFile(hSearch, WFD) '獲取下一個子目錄
 - Loop
 - Cont = FindClose(hSearch)
 - End If
 - ' 遍歷目錄并累計文件總數(shù)
 - hSearch = FindFirstFile(path & SearchStr, WFD)
 - Cont = True
 - If hSearch <> INVALID_HANDLE_VALUE Then
 - While Cont
 - FileName = StripNulls(WFD.cFileName)
 - If (FileName <> ".") And (FileName <> "..") Then
 - FindFilesAPIFindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow
 - FileCountFileCount = FileCount + 1
 - List1.AddItem path & FileName
 - End If
 - Cont = FindNextFile(hSearch, WFD) ' 獲取下一個文件
 - Wend
 - Cont = FindClose(hSearch)
 - End If
 - '如果子目錄存在則遍歷之
 - If nDir > 0 Then
 - For i = 0 To nDir - 1
 - FindFilesAPIFindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", _
 - SearchStr, FileCount, DirCount)
 - Next i
 - End If
 - End Function
 - '查找按鈕代碼
 - Sub Command1_Click()
 - Dim SearchPath As String, FindStr As String
 - Dim FileSize As Long
 - Dim NumFiles As Integer, NumDirs As Integer
 - Dim iNull As Integer, lpIDList As Long, lResult As Long
 - Dim sPath As String, udtBI As BrowseInfo
 - With udtBI
 - '設(shè)置瀏覽窗口
 - .hWndOwner = Me.hWnd
 - '返回選中的目錄
 - .ulFlags = BIF_RETURNONLYFSDIRS
 - End With
 - '調(diào)出瀏覽窗口
 - lpIDList = SHBrowseForFolder(udtBI)
 - If lpIDList Then
 - sPath = String$(MAX_PATH, 0)
 - '獲取路徑
 - SHGetPathFromIDList lpIDList, sPath
 - '釋放內(nèi)存
 - CoTaskMemFree lpIDList
 - iNull = InStr(sPath, vbNullChar)
 - If iNull Then
 - sPath = Left$(sPath, iNull - 1)
 - End If
 - End If
 - Screen.MousePointer = vbHourglass
 - List1.Clear
 - SearchPath = sPath '選中的目錄為搜索的起始路徑
 - FindStr = "*.*" '搜索所有類型的文件(此處可另作定義)
 - FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
 - Text1.Text = "查找到的文件數(shù):" & NumFiles & vbCrLf & "查找的目錄數(shù):" & _
 - NumDirs + 1 & vbCrLf & "文件大小總共為:" & vbCrLf & _
 - Format(FileSize, "#,###,###,##0") & "字節(jié)"
 - Screen.MousePointer = vbDefault
 - End Sub
 - '調(diào)出瀏覽窗口
 - lpIDList = SHBrowseForFolder(udtBI)
 - If lpIDList Then
 - sPath = String$(MAX_PATH, 0)
 - '獲取路徑
 - SHGetPathFromIDList lpIDList, sPath
 - '釋放內(nèi)存
 - CoTaskMemFree lpIDList
 - iNull = InStr(sPath, vbNullChar)
 - If iNull Then
 - sPath = Left$(sPath, iNull - 1)
 - End If
 - End If
 - Screen.MousePointer = vbHourglass
 - List1.Clear
 - SearchPath = sPath '選中的目錄為搜索的起始路徑
 - FindStr = "*.*" '搜索所有類型的文件(此處可另作定義)
 - FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)
 - Text1.Text = "查找到的文件數(shù):" & NumFiles & vbCrLf & "查找的目錄數(shù):" & _
 - NumDirs + 1 & vbCrLf & "文件大小總共為:" & vbCrLf & _
 - Format(FileSize, "#,###,###,##0") & "字節(jié)"
 - Screen.MousePointer = vbDefault
 - End Sub
 
以上就是VB.NET API函數(shù)的實(shí)例,希望對大家有幫助。
【編輯推薦】















 
 
 
 
 
 
 