在VB中如何查找文件?

maik 2003-08-22 03:38:43
同上
...全文
1522 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lele2002 2003-08-22
  • 打赏
  • 举报
回复
头都晕了:P

好多哦
lihonggen0 2003-08-22
  • 打赏
  • 举报
回复
VB查找文件的两种方法
---- 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

---- 该函数可以很快遍历整个硬盘,从而查找到我们所需的文件。
lihonggen0 2003-08-22
  • 打赏
  • 举报
回复
快速调用“查找文件对话框”


http://www0.ccidnet.com/tech/guide/2000/12/21/58_1509.html


lihonggen0 2003-08-22
  • 打赏
  • 举报
回复
利用VB的递归技术查找文件


  现今电脑硬盘的容量越来越大,其中储存的文件也越来越多,在这么多数据中要查找某一个具体的文件犹如大海捞针。幸亏Windows为我们提供了一个查找工具,利用它可以很方便地找出所需文件的确切位置。其实,我们可以自己编写一个简单的应用程序来模拟这个查找工具。Microsoft的VB6.0(5.0)就是一个理想的编程工具。

  首先介绍一下编程思路。该程序的核心是不被许多人注意的“递归”方法(Recursive Programing)——这是VB提供的一个强大的编程技术,让我们来看一看程序要做的事情:扫描一个文件夹(当然也可以是一个具体的硬盘盘符),如果该文件夹中没有子文件夹,事情当然就要好办得多——问题是情形往往不是这样,那我们该怎样处理子文件夹呢?看来这是一个棘手的细节,但一旦“递归”技术介入程序代码,就能迎刃而解了(实际上,“递归”几乎是解决这个问题的唯一方法)。具体做法是:编写一个扫描文件夹(Scan),当遇到子文件夹时中断当前文件夹的扫描,开始扫描子文件夹,即调用过程本身,如子文件夹中还有子文件夹,就采取相同的方法继续调用过程,直至文件夹(子文件夹)中不再含有子文件夹为止。

  程序涉及的控件及需改变的缺省属性如下:
  1:一个DriveListBox控件。
  2:一个DirListBox控件。
  3:一个ListBox控件,该控件用来显示查找到的文件。
  4:两个CommandButton控件。
  5:一个StatusBar控件,该控件用来显示查找到的文件个数,Style属性置为1,SimpleText属性置为“”。
  6:两个OptionButton控件,其中Option1的Value属性置为True。
  7:两个TextBox控件,Text属性都置为“”,其中Text1用来设置待查找文件的文件名,Text2用来设置待查找文件的扩展名,Text2的Enabled置为False,MaxLength属性置为3。
  8: 两个Frame控件。
  以下是程序清单:
  Option Explicit
  
  Public Sub scan(a As String)
  Dim filename As String
  Dim nd As Integer
  Dim fold() As String
  Dim n As Integer
  filename = Dir(a)
  Do While filename <> “”
  If Option1.Value =True Then
  If LCase(filename) = LCase(Text1.Text) Then
  List1.AddItem (a & filename)
  End If
  Else
  If LCase(Right(filename, 3)) = LCase(Text2.Text) Then
  List1.AddItem (a & filename)
  End If
  End If
  filename = Dir
  Loop
  filename = Dir(a, vbDirectory)
  Do While filename <> “”
  If filename <>“.” And filename <> “..” Then
  If GetAttr(a & filename) = vbDirectory Then
  nd = nd + 1
  ReDim Preserve fold(nd)
  fold(nd) = a & filename
  End If
  End If
  filename = Dir
  DoEvents
  Loop
  For n = 1 To nd
  scan fold(n) & “\”
  Next
  If List1.ListCount = 0 Then
  StatusBar1.SimpleText = “No file discovery”
  Else
  StatusBar1.SimpleText = List1.ListCount & “file(s) discovery”
  End If
  End Sub
  
  Private Sub Command1_Click()
  Dim searchfold As String
  List1.Clear
  StatusBar1.SimpleText = “”
  If Right(Dir1.Path, 1) = “\” Then
  searchfold = Left(Dir1.Path, 2)
  Else
  searchfold = Dir1.Path
  End If
  Me.MousePointer = vbHourglass
  scan searchfold & “\”
  Me.MousePointer = vbDefault
  End Sub
  
  Private Sub Command2_Click()
  Unload Me
  End Sub
  
  Private Sub Drive1_Change()
  On Error GoTo a
  Dir1.Path = Drive1.Drive
  Exit Sub
  a:
  If Left(Drive1.Drive, 1) = “a” Then
  MsgBox “Floppy drive is not be ready!”, vbCritical
  End If
  End Sub
  
  Private Sub Option1_Click()
  Text1.Enabled = True
  Text2.Enabled = False
  End Sub
  
  Private Sub Option2_Click()
  Text1.Enabled = False
  Text2.Enabled = True
  End Sub

  最后,再对程序代码作进一步的说明:
  1:过程(Scan)的参数a由DirListBox控件的选项决定,可以是硬盘盘符,如C:\(扫描整个分区),也可以是目录路径,如C:\Windows(仅扫描该目录)。
  2:Dir函数是过程中的关键。该函数的作用是查找任何驱动器上的文件或目录。如果调用带参数的Dir函数再调用不带参数的Dir函数,则函数将从当前要搜索的目录中返回与上一次指定参数相匹配的下一个文件,这就使遍历一个目录中的所有文件成为可能。
  3:程序中的错误处理语句:On Error GoTo a不能省略。这是因为如软驱中没有软盘,Drive1_Change()过程会出错

7,759

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧