Option Explicit '添加一个DIR目录控件,一个FILE文件控件!'取得文件 Public Sub GetFile(strDir As String, objDir As Object) Dim lngCount As Long Dim i As Long
File1.Path = strDir lngCount = File1.ListCount For i = 0 To lngCount - 1 List2.AddItem File1.List(i) Next
GetSubPathFile strDir, objDir End Sub'取得子目录以及文件 Public Sub GetSubPathFile(strDir As String, objDir As Object) On Error Resume Next Dim lngCount As Long Dim i As Long, j As Long With objDir .Path = strDir lngCount = .ListCount
For i = 0 To lngCount - 1 .Path = strDir
File1.Path = .List(i) List1.AddItem .List(i)
For j = 0 To File1.ListCount - 1 List2.AddItem File1.Path & "\" & File1.List(j) DoEvents Next Call GetSubPathFile(.List(i), objDir) '递归寻找 Next End With End SubPrivate Sub Command1_Click() 在窗口中加两个LIST控件 , 一个显示文件夹, 一个显示文件 List1.Clear: List2.Clear
GetFile "D:\Temp", Dir1 MsgBox List1.ListCount & vbCrLf & List2.ListCount End Sub
递归过程在VB中的应用实例 -------------------------------------------------------------------------------- Windows的资源管理器具有界面直观、 操作简便的特点,深受广大电脑爱好者的欢迎和喜爱。 利用VB提供的TreeView控件完全可以把磁盘上的目录(包括子目录)放入Node对象中,其界面具有资源管理器的特点。把磁盘上的目录放入Node对象有多种方法,应该说采用递归方法是比较简洁的。 递归过程实现的思路: 简言之,递归过程就是子程序自己调用自己。由于磁盘上的目录是树形结构,而树形的节点和节点级数是不受限定的,仅把目录名放入一维或多维数组中难度较大,不易实现。编一子程序,给定目录,并建立当前节点,加入Node对象中,根据Dir1控件判断给定目录下是否有下级目录,如有,添加下级节点,并加入Node对象中如无则退出子程序。即子程序的功能是:如给定目录有子目录,则展开当前目录求子目录。如果在给定目录展开完成后,把下级目录当成给定目录,并调用子程序进行展开,即可把给定目录下的数级子目录全部展开完毕。下面就举例说明,为简便起见,TreeView控件只放入目录,文件名省略。 实现的过程: 1、 添加TreeView控件到窗体中:单击—“工程”—“部件”,选择Microsoft Windows Common Control 6.0”(文件路径为\WinNT\System32\Mscomctl.ocx)复选框,单击—“确定“按钮,TreeView控件即可出现在工具箱中并添加。 2、 在窗体中添加Drive、DirListBox、ImageList控件。 3、 控件名及主要属性如下: 控件及窗体名 主要属性值 备注
Form Name=Form1:Caption=”测试窗体”
TreeView Name=TreeView1
Drive Name=Drive1:Visible=False 获得当前电脑磁盘的盘符
DirListBox Name=Dir1:Visible=False
ImageList Name=ImageList1 给TreeView1的Node对象图标
在应用程序当前目录下,放入一16X16的位图文件123.bmp,供TreeView1控件显示用。 实现的源程序如下: Option Explicit '必须进行变量声明 Dim nodx As Node Private Sub Form_Load() On Error Resume Next '控件与窗体一样大 TreeView1.Height = Form1.ScaleHeight TreeView1.Width = Form1.ScaleWidth '在 ImageList 控件中添加一个图象,该图像用于显示在TreeView1控件上。 Dim imgX As ListImage '调入图形文件 Set imgX = ImageList1.ListImages.Add(, , LoadPicture("123.bmp")) TreeView1.ImageList = ImageList1 '初始化ImageList。 TreeView1.LineStyle = tvwRootLines TreeView1.Style = tvwTreelinesPlusMinusPictureText Dim DriverCount As Integer Dim GivePath As String '创建根节点 Set nodx = TreeView1.Nodes.Add(, , "本人电脑", "本人电脑", 1) For DriverCount = 0 To Drive1.ListCount - 1 GivePath = Left(Drive1.List(DriverCount), 2) + "\" Set nodx = TreeView1.Nodes.Add("本人电脑", tvwChild, GivePath, GivePath, 1) SSplitNode GivePath '把各盘的文件夹进行展开放于TreeView1控件中 Next DriverCount End Sub Sub SSplitNode(sGivePath As String) '子过程 '把给定目录下的子目录全部加入Node对象中 Dim SDI As Integer Dim SDCount As Integer '用于存放给定目录的下级子目录,该变量数组随递归过程调用而发生变化 Dim GivePathSubDir() As String '如有则展开目录并放入TreeView1控件中 Dir1.Path = sGivePath SDCount = Dir1.ListCount If SDCount <> 0 Then ReDim GivePathSubDir(SDCount - 1) '把下级目录放入变量数组GivePathSubDir中 SubSaveSubDir sGivePath, GivePathSubDir, SDCount End If If SDCount = 0 Then Exit Sub '即为递归出口。否则会形成死循环。 For SDI = 0 To SDCount - 1 Set nodx = TreeView1.Nodes.Add(sGivePath, tvwChild, _ GivePathSubDir(SDI), FOnlyPath(GivePathSubDir(SDI)), 1) Next SDI '调用递归(子程序自己调用自己) For SDI = 0 To SDCount - 1 sGivePath = GivePathSubDir(SDI) SSplitNode sGivePath Next SDI End Sub Sub SubSaveSubDir(fGivePath As String, fGivePathSubDir() As String, fSDCount As Integer) 'fGivePath 给定目录串 'fGivePathSubDir 用于存放子目录 'fSDCount 子目录数 Dim i As Integer: Dim t As Integer Dir1.Path = fGivePath t = Dir1.ListCount For i = 0 To t - 1 fGivePathSubDir(i) = Dir1.List(i) Next i fSDCount = t End Sub Function FOnlyPath(DString As String) As String '功能是去掉上级目录,只留下当前目录名 'DString为给定的全路径目录名 If DString = "" Then Exit Function Dim DLength As Integer DLength = Len(DString) Dim DD As Integer For DD = DLength To 1 Step -1 If Mid(DString, DD, 1) = "\" Then Exit For Next DD FOnlyPath = Mid(DString, DD + 1) End Function Private Sub Form_Resize() '控件与窗体一样大 TreeView1.Height = Form1.ScaleHeight TreeView1.Width = Form1.ScaleWidth End Sub 本程序在Win2000,VB6.0中文版下通过。
'添加一个DIR目录控件,一个FILE文件控件!'取得文件
Public Sub GetFile(strDir As String, objDir As Object)
Dim lngCount As Long
Dim i As Long
File1.Path = strDir
lngCount = File1.ListCount
For i = 0 To lngCount - 1
List2.AddItem File1.List(i)
Next
GetSubPathFile strDir, objDir
End Sub'取得子目录以及文件
Public Sub GetSubPathFile(strDir As String, objDir As Object)
On Error Resume Next
Dim lngCount As Long
Dim i As Long, j As Long With objDir
.Path = strDir
lngCount = .ListCount
For i = 0 To lngCount - 1
.Path = strDir
File1.Path = .List(i)
List1.AddItem .List(i)
For j = 0 To File1.ListCount - 1
List2.AddItem File1.Path & "\" & File1.List(j)
DoEvents
Next Call GetSubPathFile(.List(i), objDir) '递归寻找
Next
End With
End SubPrivate Sub Command1_Click()
在窗口中加两个LIST控件 , 一个显示文件夹, 一个显示文件
List1.Clear: List2.Clear
GetFile "D:\Temp", Dir1
MsgBox List1.ListCount & vbCrLf & List2.ListCount
End Sub
Windows的资源管理器具有界面直观、 操作简便的特点,深受广大电脑爱好者的欢迎和喜爱。
利用VB提供的TreeView控件完全可以把磁盘上的目录(包括子目录)放入Node对象中,其界面具有资源管理器的特点。把磁盘上的目录放入Node对象有多种方法,应该说采用递归方法是比较简洁的。
递归过程实现的思路:
简言之,递归过程就是子程序自己调用自己。由于磁盘上的目录是树形结构,而树形的节点和节点级数是不受限定的,仅把目录名放入一维或多维数组中难度较大,不易实现。编一子程序,给定目录,并建立当前节点,加入Node对象中,根据Dir1控件判断给定目录下是否有下级目录,如有,添加下级节点,并加入Node对象中如无则退出子程序。即子程序的功能是:如给定目录有子目录,则展开当前目录求子目录。如果在给定目录展开完成后,把下级目录当成给定目录,并调用子程序进行展开,即可把给定目录下的数级子目录全部展开完毕。下面就举例说明,为简便起见,TreeView控件只放入目录,文件名省略。
实现的过程:
1、 添加TreeView控件到窗体中:单击—“工程”—“部件”,选择Microsoft Windows Common Control 6.0”(文件路径为\WinNT\System32\Mscomctl.ocx)复选框,单击—“确定“按钮,TreeView控件即可出现在工具箱中并添加。
2、 在窗体中添加Drive、DirListBox、ImageList控件。
3、 控件名及主要属性如下:
控件及窗体名
主要属性值
备注
Form
Name=Form1:Caption=”测试窗体”
TreeView
Name=TreeView1
Drive
Name=Drive1:Visible=False
获得当前电脑磁盘的盘符
DirListBox
Name=Dir1:Visible=False
ImageList
Name=ImageList1
给TreeView1的Node对象图标
在应用程序当前目录下,放入一16X16的位图文件123.bmp,供TreeView1控件显示用。
实现的源程序如下:
Option Explicit '必须进行变量声明
Dim nodx As Node
Private Sub Form_Load()
On Error Resume Next
'控件与窗体一样大
TreeView1.Height = Form1.ScaleHeight
TreeView1.Width = Form1.ScaleWidth
'在 ImageList 控件中添加一个图象,该图像用于显示在TreeView1控件上。
Dim imgX As ListImage
'调入图形文件
Set imgX = ImageList1.ListImages.Add(, , LoadPicture("123.bmp"))
TreeView1.ImageList = ImageList1 '初始化ImageList。
TreeView1.LineStyle = tvwRootLines
TreeView1.Style = tvwTreelinesPlusMinusPictureText
Dim DriverCount As Integer
Dim GivePath As String
'创建根节点
Set nodx = TreeView1.Nodes.Add(, , "本人电脑", "本人电脑", 1)
For DriverCount = 0 To Drive1.ListCount - 1
GivePath = Left(Drive1.List(DriverCount), 2) + "\"
Set nodx = TreeView1.Nodes.Add("本人电脑", tvwChild, GivePath, GivePath, 1)
SSplitNode GivePath '把各盘的文件夹进行展开放于TreeView1控件中
Next DriverCount
End Sub
Sub SSplitNode(sGivePath As String) '子过程
'把给定目录下的子目录全部加入Node对象中
Dim SDI As Integer
Dim SDCount As Integer
'用于存放给定目录的下级子目录,该变量数组随递归过程调用而发生变化
Dim GivePathSubDir() As String
'如有则展开目录并放入TreeView1控件中
Dir1.Path = sGivePath
SDCount = Dir1.ListCount
If SDCount <> 0 Then
ReDim GivePathSubDir(SDCount - 1)
'把下级目录放入变量数组GivePathSubDir中
SubSaveSubDir sGivePath, GivePathSubDir, SDCount
End If
If SDCount = 0 Then Exit Sub
'即为递归出口。否则会形成死循环。
For SDI = 0 To SDCount - 1
Set nodx = TreeView1.Nodes.Add(sGivePath, tvwChild, _
GivePathSubDir(SDI), FOnlyPath(GivePathSubDir(SDI)), 1)
Next SDI
'调用递归(子程序自己调用自己)
For SDI = 0 To SDCount - 1
sGivePath = GivePathSubDir(SDI)
SSplitNode sGivePath
Next SDI
End Sub
Sub SubSaveSubDir(fGivePath As String, fGivePathSubDir() As String, fSDCount As Integer)
'fGivePath 给定目录串
'fGivePathSubDir 用于存放子目录
'fSDCount 子目录数
Dim i As Integer: Dim t As Integer
Dir1.Path = fGivePath
t = Dir1.ListCount
For i = 0 To t - 1
fGivePathSubDir(i) = Dir1.List(i)
Next i
fSDCount = t
End Sub
Function FOnlyPath(DString As String) As String
'功能是去掉上级目录,只留下当前目录名
'DString为给定的全路径目录名
If DString = "" Then Exit Function
Dim DLength As Integer
DLength = Len(DString)
Dim DD As Integer
For DD = DLength To 1 Step -1
If Mid(DString, DD, 1) = "\" Then Exit For
Next DD
FOnlyPath = Mid(DString, DD + 1)
End Function
Private Sub Form_Resize()
'控件与窗体一样大
TreeView1.Height = Form1.ScaleHeight
TreeView1.Width = Form1.ScaleWidth
End Sub
本程序在Win2000,VB6.0中文版下通过。