我编写了一个Windows窗体脚本,用于搜索系统中的所有非隐藏和非读取文件夹。但是脚本本身在最初运行时运行了5分钟。随后的开放花费的时间要少得多。我想知道它是否存在逻辑错误,以至于为什么它的运行速度非常慢。
Private Function FindSubFolders(ByVal dir As DirectoryInfo, ByVal node As TreeNode) As TreeNode
Dim subnode As New TreeNode
For Each folder As DirectoryInfo In dir.GetDirectories()
If (folder.Attributes And FileAttributes.Hidden) <> FileAttributes.Hidden Then
subnode = node.Nodes.Add(folder.FullName, folder.Name)
subnode = FindSubFolders(folder, subnode)
End If
Next
Return subnode
End Function
Private Sub SetFolders_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Is it possible to load this on 1st (initial) form load???
Try
Dim node As TreeNode
If TreeView1.Nodes.Count < 1 Then
For Each drive As String In Directory.GetLogicalDrives
Directory.GetLogicalDrives()
Dim folders As DirectoryInfo = New DirectoryInfo(drive)
If (folders.Attributes And FileAttributes.ReadOnly) <> FileAttributes.ReadOnly Then
node = TreeView1.Nodes.Add(drive, drive)
Try
node = FindSubFolders(folders, node)
Catch ex As Exception
Console.WriteLine(ex.Message)
Continue For
End Try
End If
Next
End If
If Not IsNothing(My.Settings.Folders) Then
If ListBox1.Items.Count < 1 Then
For Each col As String In My.Settings.Folders
ListBox1.Items.Add(col)
Next
End If
Else
My.Settings.Folders = New StringCollection
End If
Catch ex As Exception
Logs.Add("04", ex.Message)
End Try
Logs.Add("01", "Loaded.")
End Sub
感谢您的帮助! :)
答案 0 :(得分:1)
以下是一些提示:
您可以做的一件事就是确保每次向其添加项目时TreeView控件都不必重绘自身。 在添加任何项目之前,请运行 Treeview1.BeginUpdate ,并在添加完所有项目后运行 Treeview1.EndUpdate
如果可能,将目录作为数组获取,并使用node.addrange一次添加一系列directiry。
来自MSDN:
保持物品的性能 每次添加一个 TreeView,调用BeginUpdate方法。 BeginUpdate方法阻止了 从绘画到控制 调用EndUpdate方法。该 将项添加到树的首选方法 视图控件是使用AddRange 添加树节点数组的方法 项目到树视图。但是,如果你 想要一次添加一个项目,请使用 BeginUpdate方法来防止 从绘画期间的TreeView控件 添加操作。允许的 控制恢复绘画,打电话给 所有树时的EndUpdate方法 节点已添加到树中 图。
查看此问题以获取(可能)更简单的方法来获取子文件夹:
Get all folder / directories list in VB.net