first Не использовать фоновую рабочую задачу, поток или асинхронную работу
Я обновляю abit и добавляю событие onExpand, чтобы вам не нужно было загружать все hardrive за один запуск. каждый корень после расширения
есть также пример угрозы, при обновлении через угрозу вам нужно использовать Invoke, если не обнаруживается перекрестная угроза. Не экономит на 100%. У вас есть база
Private Sub TreeView1_BeforeExpand(sender As Object, e As TreeViewCancelEventArgs) Handles TreeView1.BeforeExpand
Dim tr = New Threading.Thread(AddressOf ExpandNode)
tr.Start(e.Node)
End Sub
Sub UpNode(e As TreeNode, onNod As TreeNode())
e.Nodes.Clear()
e.Nodes.AddRange(onNod)
End Sub
Public Sub ExpandNode(e As TreeNode)
Dim l = PopulateTreeView(e.Tag)
Me.Invoke(Sub() UpNode(e, l))
End Sub
Private Function PopulateTreeView(ByVal dir As String) As TreeNode()
Dim Li As New List(Of TreeNode)
Dim folder As String = String.Empty
Try
'Add folders to treeview
Dim folders() As String = IO.Directory.GetDirectories(dir)
If folders.Length <> 0 Then
For Each folder In folders
Dim Ndir = New TreeNode
Ndir.Tag = folder
Ndir.Text = System.IO.Path.GetFileName(folder)
Ndir.Nodes.Add(".")
Li.Add(Ndir)
Next
End If
'Add the files to treeview
Dim files() As String = IO.Directory.GetFiles(dir)
If files.Length <> 0 Then
Dim fileNode As TreeNode = New TreeNode
For Each file As String In files
fileNode.Tag = file
fileNode.Text = System.IO.Path.GetFileName(file)
If file.Contains(".html") Or file.Contains(".htm") Or file.Contains(".HTML") Or file.Contains(".HTM") Then
fileNode.Name = "html"
ElseIf file.Contains(".css") Or file.Contains(".CSS") Then
fileNode.Name = "css"
ElseIf file.Contains(".js") Or file.Contains(".JS") Then
fileNode.Name = "js"
ElseIf file.Contains(".php") Or file.Contains(".PHP") Then
fileNode.Name = "php"
ElseIf file.Contains(".png") Or file.Contains(".PNG") Then
fileNode.Name = "png"
ElseIf file.Contains(".bmp") Or file.Contains(".BMP") Then
fileNode.Name = "bmp"
ElseIf file.Contains(".gif") Or file.Contains(".GIF") Then
fileNode.Name = "gif"
ElseIf file.Contains(".jpg") Or file.Contains(".jpeg") Or file.Contains(".JPG") Or file.Contains(".JPEG") Then
fileNode.Name = "jpg"
ElseIf file.Contains(".txt") Or file.Contains(".TXT") Then
fileNode.Name = "txt"
ElseIf file.Contains(".ttf") Or file.Contains(".TTF") Or file.Contains(".otf") Or file.Contains(".OTF") Then
fileNode.Name = "font"
Else
fileNode.Name = "other"
End If
Next
Li.Add(fileNode)
End If
Catch ex As UnauthorizedAccessException
Li.Add(New TreeNode With {.Tag = Nothing, .Name = "Access Denied"})
End Try
Return Li.ToArray
End Function
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Node = New TreeNode
Node.Tag = "C:\"
Node.Text = "C:"
Node.Nodes.Add(".")
TreeView1.Nodes.Add(Node)
End Sub