以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  文件查找(递归函数一例)  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=57306)

--  作者:明丰
--  发布时间:2014/9/22 18:01:00
--  文件查找(递归函数一例)

递归函数用法介绍比较少,这里重新整理一下。如有误,请老师指正,谢谢!

目的:文件查找

       递归函数就是函数的自我调用,也就是多次循环,在循环次数不确定的情况下,

一般会用到递归函数。

如果只知道文件名称,不知道上层是几级目录,这里适用递归函数。

过程:把非末级目录通过递归函数进行循环,代码执行过程中如果是末级目录→输出,

如果非末级目录,再次进行循环,直到是末级目录,才终止循环。

代码:

Dim str As String = args(0) \'Args(0)表示第一个参数,“非末级目录”传递给该参数

For Each dir As String In FileSys.GetDirectories(str) \'遍历下级目录

Dim ifo As new FileInfo(dir) \'定义FileInfo

    If ifo.Hidden = False Then \'处理系统文件,避免报错

        List11.AddRange(FileSys.GetFiles(dir))

\'输出,将目录下的文件名称批量添加到全局变量List11

        If FileSys.GetDirectories(dir).count = 0 Then

\'如果为末级目录,如果接下来都是末级目录,该函数会自动退出循环

        Else ‘如果非末级目录

            Functions.Execute("FMJ",dir)

 \'调用该函数,非末级目录赋值给该函数,再次循环

        End If

    End If

Next

[此贴子已经被作者于2014-9-22 18:19:53编辑过]

--  作者:有点甜
--  发布时间:2014/9/22 18:06:00
--  
 嗯嗯呢
--  作者:zyqzyy
--  发布时间:2014/9/22 18:21:00
--  

上个例子,好!


--  作者:明丰
--  发布时间:2014/9/22 18:27:00
--  
上传了4次,没显示啊!

窗口与控件事件

 

文件查找_AfterLoad

 

List11.clear \'清除全局变量List11原来的值

 

文件查找_Button1_Click

 

e.Form.Controls("TextBox2").value = Nothing

If e.Form.Controls("TextBox1").value Is Nothing Then

Else

Dim s As String = e.Form.Controls("TextBox1").value

\'List11.clear \'清除全局变量List11原来的值

If List11.count = 0 Then

Dim ds() As System.IO.DriveInfo = System.IO.DriveInfo.GetDrives()\'检索驱动器名称(盘符)

For i As Integer = 0 To ds.Length - 1   \'盘符

    If FileSys.DirectoryExists(ds(i).Name) Then \'判断是否为有效盘符

        \'List11.Add(ds(i).Name) \'添加目录

        List11.AddRange(FileSys.GetFiles(ds(i).Name)) \'添加文件

        Functions.Execute("FMJ", ds(i).Name) \'非末级目录放入递归函数,结果输出到全局变量List11

    End If

Next

End If

Dim ii As Integer

Dim ss As String

For Each nm As String In List11

    If nm.contains(s) Then

ii = ii+1

If ss = Nothing Then

ss = nm

Else

    ss = ss & vbcrlf & nm

    End If

End If

Next

ss = "共找到 " & ii & " 条记录" & vbcrlf & ss

e.Form.Controls("TextBox2").value = ss

End If

 

文件查找_Button2_Click

 

e.Form.Controls("TextBox2").value = Nothing

If e.Form.Controls("TextBox1").value Is Nothing Then

Else

Dim s As String = e.Form.Controls("TextBox1").value

List11.clear \'清除全局变量List11原来的值

Dim ds() As System.IO.DriveInfo = System.IO.DriveInfo.GetDrives()\'检索驱动器名称(盘符)

For i As Integer = 0 To ds.Length - 1   \'盘符

    If FileSys.DirectoryExists(ds(i).Name) Then \'判断是否为有效盘符

        \'List11.Add(ds(i).Name) \'添加目录

        List11.AddRange(FileSys.GetFiles(ds(i).Name)) \'添加文件

        Functions.Execute("FMJ", ds(i).Name) \'非末级目录放入递归函数,结果输出到全局变量List11

    End If

Next

Dim ii As Integer

Dim ss As String

For Each nm As String In List11

    If nm.contains(s) Then

ii = ii+1

If ss = Nothing Then

ss = nm

Else

    ss = ss & vbcrlf & nm

    End If

End If

Next

ss = "共找到 " & ii & " 条记录" & vbcrlf & ss

e.Form.Controls("TextBox2").value = ss

End If

 

自定义函数

 

FMJ

 

Dim str As String = args(0) \'非末级目录

For Each dir As String In FileSys.GetDirectories(str) \'遍历目录

    Dim ifo As new FileInfo(dir) \'用于处理文件

    If ifo.Hidden = False Then \'

        \'List11.Add(dir) \'添加目录

        List11.AddRange(FileSys.GetFiles(dir)) \'添加文件

        If FileSys.GetDirectories(dir).count = 0 Then \'如果为末级目录

        Else

            Functions.Execute("FMJ",dir) \'再次循环

        End If

    End If

Next

 

全局代码

 

Public List11 As New List(Of String)

[此贴子已经被作者于2014-9-22 18:52:37编辑过]