VB查找文件的兩種方法
發表于:2007-07-14來源:作者:點擊數:
標簽:
民政部信息中心 方云波 ---- VB 開發 人員都會遇到文件定位的問題。VB提供的Dir[(pathname[, attributes])]函數應該可以滿足各種文件定位問題。使用Dir函數時,我們必須給它提供文件的全部路徑,否則是找不到的。而有時我們往往是不知道文件的路徑的,如果要
民政部信息中心 方云波
----
VB開發人員都會遇到文件定位的問題。VB提供的Dir[(pathname[, attributes])]函數應該可以滿足各種文件定位問題。使用Dir函數時,我們必須給它提供文件的全部路徑,否則是找不到的。而有時我們往往是不知道文件的路徑的,如果要利用該函數來定位文件,我們必須編寫一定的代碼。筆者在利用該函數編制查找文件的函數時,頗費了些工夫,可是發現查找的效率不高,效果不太理想。那么有沒有編碼少且更快的方法查找文件呢?筆者后來利用一個 API函數成功地編制了一個高效率的查找文件的函數。下面一一介紹給大家,起個拋磚引玉的作用,期望大家能編制出更高效的函數。
---- 一. 利用DIR函數查找文件
---- Dir[(pathname[, attributes])]是VB提供的用來檢查某些文件或目錄是否存在的函數,它返回一個 String,用以表示一個文件名、目錄名或文件夾名稱,返回值必須與指定的模式或文件屬性、或磁盤卷標相匹配。
---- 如果文件的路徑很清楚,那么確定文件是否存在簡單地調用該函數就行了。如果光知道文件名,甚或只知道文件的后綴,要定位文件的話就需要一定的編碼了。下面的例子用來定位c:\下所有目錄內是否有文件Win.ini。
Function FindDirectory(RootPath As
String, Mydirectory() As String)
Dim intResult, I, intFind As Integer
‘首先查找根目錄下的所有子目錄
MyPath = "c:\" 注釋: 指定路徑c:\。
MyName = Dir(MyPath,
vbDirectory) 注釋: 找尋第一項。
intResult = 1
ReDim Mydirectory(intResult) ‘初始化動態數組
Do While MyName < > "" 注釋: 開始循環。
注釋: 跳過當前的目錄及上層目錄。
If MyName < > "." And MyName < > ".." Then
注釋: 使用位比較來確定 MyName 代表一目錄。
If (GetAttr(MyPath & MyName)
And vbDirectory) = vbDirectory Then
注釋: 如果它是一個目錄,將其名稱存儲在一個數組里。
Mydirectory(intResult) = MyPath & MyName
intResult = intResult + 1
ReDim Preserve Mydirectory(intResult)
‘分配動態數組實際的元素個數,并保留數組中的數據
End If
End If
MyName = Dir 注釋: 查找下一個目錄。
Loop
‘在所有目錄里分別查找文件是否存在。
For I = 1 To UBound(Mydirectory)-1
MyFile = Mydirectory(I) & "\win.ini"
intFind = Len(Dir(MyFile))
If intFind < > 0 Then MsgBox "找到文件" &
Dir(MyFile) & "在:" & Mydirectory(I)
Next I
End Function
---- 該函數的思路很清晰:先遍歷根目錄下所有的子目錄,然后在每個子目錄里查找文件。該函數有一個
缺陷:只能查找根目錄下的一級子目錄,無法遍及整個硬盤。如果要遍及整個硬盤,還需要額外的編碼,這里不再多述。
---- 二. 利用API函數查找文件
---- 在使用VB的過程中我深深地體會到,只有充分利用API的函數才能更充分地發揮VB的優勢。 API函數 SearchTreeFile可以很快地定位一個文件。借助該函數筆者編了一個快速查找文件的函數sysFileFind.
Declare
Public Declare Function SearchTreeForFile Lib
"imagehlp.dll" (ByVal lpRoothPath As String,
ByVal lpInputName As String,
ByVal lpOutputName As String) As Long
---- 下面為sysFileFind函數的編碼:
Public Function sysFileFind
(ByVal WhichRootPath As String,
ByVal WhichFileName As String) As String
Dim iNull As Integer
Dim lResult As Long
Dim sBuffer As String
On Error GoTo L_FILEFINDERROR
sBuffer = String$(1024, 0)
注釋:查找文件
lResult = SearchTreeForFile
(WhichRootPath, WhichFileName, sBuffer)
注釋:如果文件找到,將返回字符串后續的空格刪除
注釋:否則返回一個空字符串
If lResult Then
iNull = InStr(sBuffer, vbNullChar)
If Not iNull Then
sBuffer = Left$(sBuffer, iNull - 1)
End If
sysFileFind = sBuffer
Else
sysFileFind = ""
End If
Exit Function
L_FILEFINDERROR:
MsgBox "查找文件過程中遇到錯誤!",
vbInformation, "查找文件錯誤"
sysFileFind = Format(Err.Number)
& " - " & Err.Description
End Function
---- 該函數可以很快遍歷整個硬盤,從而查找到我們所需的文件。
---- 三. 總結
---- 上面兩個函數都在中文VB5和Win98環境下調試通過。我們可以看到第二種方法編碼更簡單,效率更高。
---- VB5強大的功能贏得了越來越多開發人員的青睞。如果適當地利用API函數,我們可以說,利用VB可以輕松地完成我們開發中的所有任務。
原文轉自:http://www.anti-gravitydesign.com