如何运用VB.NET API函数遍历实例

开发 后端
文章介绍如何用Windows VB.NET API函数遍历指定驱动器、目录的所有文件,运用API函数遍历该目录以及参照API-Guide的例子程序。

VB.NET经过长时间的发展,很多用户都很了解VB.NET了,这里我来拓展介绍一下VB.NET API函数的运用,让大家更好的深入了解。

以下代码演示了如何用Windows VB.NET API函数遍历指定驱动器、目录的所有文件。其思路是:调出浏览文件夹窗口让用户指定所要搜索的起始路径,然后用查找文件的API函数遍历该目录下及其包含的子目录下的所有文件。本例需要:一个按钮,一个TextBox和一个ListBox,其中,TextBox应设置为多行。
核心代码参照API-Guide的两个例子程序,特此声明。

Option Explicit

  1. '查找***个文件的API  
  2. Private Declare Function FindFirstFile Lib "kernel32" Alias "FindFirstFileA" 
    (ByVal lpFileName As String, lpFindFileData As WIN32_FIND_DATA) As Long  
  3. '查找下一个文件的API  
  4. Private Declare Function FindNextFile Lib "kernel32" Alias "FindNextFileA" 
    (ByVal hFindFile As Long, lpFindFileData As WIN32_FIND_DATA) As Long  
  5. '获取文件属性的API  
  6. Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" 
    (ByVal lpFileName As String) As Long  
  7. '关闭查找文件的API  
  8. Private Declare Function FindClose Lib "kernel32" (ByVal hFindFile As Long) As Long  
  9. '以下为调用浏览文件夹窗口的API  
  10. Private Declare Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)  
  11. Private Declare Function lstrcat Lib "kernel32" Alias "lstrcatA" 
    (ByVal lpString1 As String, ByVal lpString2 As String) As Long  
  12. Private Declare Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long  
  13. Private Declare Function SHGetPathFromIDList Lib "shell32" 
    (ByVal pidList As Long, ByVal lpBuffer As String) As Long  
  14. '常量  
  15. Const MAX_PATH = 260 
  16. Const MAXDWORD = &HFFFF  
  17. Const INVALID_HANDLE_VALUE = -1  
  18. Const FILE_ATTRIBUTE_ARCHIVE = &H20  
  19. Const FILE_ATTRIBUTE_DIRECTORY = &H10  
  20. Const FILE_ATTRIBUTE_HIDDEN = &H2  
  21. Const FILE_ATTRIBUTE_NORMAL = &H80  
  22. Const FILE_ATTRIBUTE_READONLY = &H1  
  23. Const FILE_ATTRIBUTE_SYSTEM = &H4  
  24. Const FILE_ATTRIBUTE_TEMPORARY = &H100  
  25. Const BIF_RETURNONLYFSDIRS = 1 
  26. Private Type FILETIME  
  27. dwLowDateTime As Long  
  28. dwHighDateTime As Long  
  29. End Type  
  30. '定义类(用于查找文件)  
  31. Private Type WIN32_FIND_DATA  
  32. dwFileAttributes As Long  
  33. ftCreationTime As FILETIME  
  34. ftLastAccessTime As FILETIME  
  35. ftLastWriteTime As FILETIME  
  36. nFileSizeHigh As Long  
  37. nFileSizeLow As Long  
  38. dwReserved0 As Long  
  39. dwReserved1 As Long  
  40. cFileName As String * MAX_PATH  
  41. cAlternate As String * 14  
  42. End Type  
  43. '定义类(用于浏览文件夹窗口)  
  44. Private Type BrowseInfo  
  45. hWndOwner As Long  
  46. pIDLRoot As Long  
  47. pszDisplayName As Long  
  48. lpszTitle As Long  
  49. ulFlags As Long  
  50. lpfnCallback As Long  
  51. lParam As Long  
  52. iImage As Long  
  53. End Type  
  54. '自定义函数  
  55. Function StripNulls(OriginalStr As String) As String  
  56. If (InStr(OriginalStr, Chr(0)) > 0) Then  
  57. OriginalStr = Left(OriginalStr, InStr(OriginalStr, Chr(0)) - 1)  
  58. End If  
  59. StripNulls = OriginalStr 
  60. End Function  
  61. '自定义函数  
  62. Function FindFilesAPI(path As String, SearchStr As String, FileCount As Integer, _  
  63. DirCount As Integer)  
  64. Dim FileName As String ' 文件名  
  65. Dim DirName As String ' 子目录名  
  66. Dim dirNames() As String ' 目录数组  
  67. Dim nDir As Integer ' 当前路径的目录数  
  68. Dim i As Integer ' 循环计数器变量  
  69. Dim hSearch As Long ' 搜索句柄变量  
  70. Dim WFD As WIN32_FIND_DATA  
  71. Dim Cont As Integer  
  72. If Right(path, 1) <> "\" Then pathpath = path & "\"  
  73. '搜索子目录  
  74. nDir = 0 
  75. ReDim dirNames(nDir)  
  76. Cont = True 
  77. hSearch = FindFirstFile(path & "*", WFD)  
  78. If hSearch <> INVALID_HANDLE_VALUE Then  
  79. Do While Cont  
  80. DirName = StripNulls(WFD.cFileName)  
  81. If (DirName <> ".") And (DirName <> "..") Then  
  82. If GetFileAttributes(path & DirName) And FILE_ATTRIBUTE_DIRECTORY Then  
  83. dirNames(nDir) = DirName  
  84. DirCountDirCount = DirCount + 1  
  85. nDirnDir = nDir + 1  
  86. ReDim Preserve dirNames(nDir)  
  87. End If  
  88. End If  
  89. Cont = FindNextFile(hSearch, WFD) '获取下一个子目录  
  90. Loop  
  91. Cont = FindClose(hSearch)  
  92. End If  
  93. ' 遍历目录并累计文件总数  
  94. hSearch = FindFirstFile(path & SearchStr, WFD)  
  95. Cont = True 
  96. If hSearch <> INVALID_HANDLE_VALUE Then  
  97. While Cont  
  98. FileName = StripNulls(WFD.cFileName)  
  99. If (FileName <> ".") And (FileName <> "..") Then  
  100. FindFilesAPIFindFilesAPI = FindFilesAPI + (WFD.nFileSizeHigh * MAXDWORD) + WFD.nFileSizeLow  
  101. FileCountFileCount = FileCount + 1  
  102. List1.AddItem path & FileName  
  103. End If  
  104. Cont = FindNextFile(hSearch, WFD) ' 获取下一个文件  
  105. Wend  
  106. Cont = FindClose(hSearch)  
  107. End If  
  108. '如果子目录存在则遍历之  
  109. If nDir > 0 Then  
  110. For i = 0 To nDir - 1  
  111. FindFilesAPIFindFilesAPI = FindFilesAPI + FindFilesAPI(path & dirNames(i) & "\", _  
  112. SearchStr, FileCount, DirCount)  
  113. Next i  
  114. End If  
  115. End Function  
  116. '查找按钮代码  
  117. Sub Command1_Click()  
  118. Dim SearchPath As String, FindStr As String  
  119. Dim FileSize As Long  
  120. Dim NumFiles As Integer, NumDirs As Integer  
  121. Dim iNull As Integer, lpIDList As Long, lResult As Long  
  122. Dim sPath As String, udtBI As BrowseInfo  
  123. With udtBI  
  124. '设置浏览窗口  
  125. .hWndOwner = Me.hWnd  
  126. '返回选中的目录  
  127. .ulFlags = BIF_RETURNONLYFSDIRS 
  128. End With  
  129. '调出浏览窗口  
  130. lpIDList = SHBrowseForFolder(udtBI)  
  131. If lpIDList Then  
  132. sPath = String$(MAX_PATH, 0)  
  133. '获取路径  
  134. SHGetPathFromIDList lpIDList, sPath  
  135. '释放内存  
  136. CoTaskMemFree lpIDList  
  137. iNull = InStr(sPath, vbNullChar)  
  138. If iNull Then  
  139. sPath = Left$(sPath, iNull - 1)  
  140. End If  
  141. End If  
  142. Screen.MousePointer = vbHourglass 
  143. List1.Clear  
  144. SearchPath = sPath '选中的目录为搜索的起始路径  
  145. FindStr = "*.*" '搜索所有类型的文件(此处可另作定义)  
  146. FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)  
  147. Text1.Text = "查找到的文件数:" & NumFiles & vbCrLf & "查找的目录数:" & _  
  148. NumDirs + 1 & vbCrLf & "文件大小总共为:" & vbCrLf & _  
  149. Format(FileSize, "#,###,###,##0") & "字节"  
  150. Screen.MousePointer = vbDefault 
  151. End Sub   
  152. '调出浏览窗口  
  153. lpIDList = SHBrowseForFolder(udtBI)  
  154. If lpIDList Then  
  155. sPath = String$(MAX_PATH, 0)  
  156. '获取路径  
  157. SHGetPathFromIDList lpIDList, sPath  
  158. '释放内存  
  159. CoTaskMemFree lpIDList  
  160. iNull = InStr(sPath, vbNullChar)  
  161. If iNull Then  
  162. sPath = Left$(sPath, iNull - 1)  
  163. End If  
  164. End If  
  165. Screen.MousePointer = vbHourglass 
  166. List1.Clear  
  167. SearchPath = sPath '选中的目录为搜索的起始路径  
  168. FindStr = "*.*" '搜索所有类型的文件(此处可另作定义)  
  169. FileSize = FindFilesAPI(SearchPath, FindStr, NumFiles, NumDirs)  
  170. Text1.Text = "查找到的文件数:" & NumFiles & vbCrLf & "查找的目录数:" & _  
  171. NumDirs + 1 & vbCrLf & "文件大小总共为:" & vbCrLf & _  
  172. Format(FileSize, "#,###,###,##0") & "字节"  
  173. Screen.MousePointer = vbDefault 
  174. End Sub    

以上就是VB.NET API函数的实例,希望对大家有帮助。

【编辑推荐】

  1. 强化VB.NET Word文档创建Document对象
  2. VB.NET Word对象模型两大要点介绍
  3. 全方位VB.NET文件操作和分类讲述
  4. 细谈VB.NET路径选择对话框实现(API)实例
  5. 强化VB.NET编程多线程句柄技巧
责任编辑:田树 来源: 重庆IT商网
相关推荐

2009-10-28 15:01:59

VB.NET SHEL

2009-10-26 10:44:27

VB.NET API函

2009-11-03 12:52:38

VB.NET Wind

2009-11-04 11:32:20

VB.NET回调函数

2009-10-15 17:50:48

VB.NET调用API

2009-10-23 10:01:28

VB.NET申明Win

2009-11-03 09:37:33

VB.NET重载

2009-11-02 10:30:37

VB.NET EXCE

2009-11-03 13:02:28

VB.NET Wind

2009-10-15 17:50:48

VB.NET Spli

2009-10-28 14:13:32

VB.NET File

2009-10-28 14:34:44

VB.NET Tree

2009-10-21 10:45:50

VB.NET Quic

2009-11-02 11:02:58

VB.NET XML文

2009-11-10 15:52:20

VB.NET变量名

2010-01-18 18:20:49

VB.NET使用API

2010-01-19 18:24:29

VB.NET调用Win

2010-01-07 16:46:28

VB.NET延时函数

2009-10-29 16:29:02

VB.NET文件系统对

2009-10-20 14:05:42

VB.NET路径
点赞
收藏

51CTO技术栈公众号