Torna al Thread
'L'elemento dummy per mostrare il +
Dim dummy As New TreeNode()
'Le icone già caricate
Dim loadedIcons As New Dictionary(Of String, IntPtr)
<DllImport("shell32.dll")> _
Shared Function ExtractAssociatedIcon( _
ByVal hInstance As IntPtr, _
ByVal lpIconPath As String, _
ByRef lpiIcon As Integer) As IntPtr
End Function
<DllImport("user32.dll")> _
Shared Function DestroyIcon(ByVal hIcon As IntPtr) As Boolean
End Function
Private Sub Form3_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Crea un'ImageList che contiene le icone dei file
Dim imgList As New ImageList
imgList.ImageSize = New Size(32, 32)
imgList.ColorDepth = ColorDepth.Depth32Bit
'Associa l'ImageList sia per le icone piccole
'che per quelle grandi
ListView1.SmallImageList = imgList
ListView1.LargeImageList = imgList
'Imposta il Tag della dummy su "dummy"
dummy.Tag = "dummy"
'Crea i nodi base della TreeView
Dim drivers As String() = Directory.GetLogicalDrives()
'Aggiunge ogni percorso base
Dim Cartelle As String
For Each Cartelle In drivers
Dim added As TreeNode = TreeView1.Nodes.Add(Cartelle)
added.Tag = Cartelle
'Aggiunge anche il sottonodo dummy
added.Nodes.Add(dummy.Clone())
Next
End Sub
Private Sub TreeView1_AfterExpand(ByVal sender As Object, ByVal e As TreeViewEventArgs) Handles TreeView1.AfterExpand
TreeView1.BeginUpdate()
Try
'ottiene le sottodirectory del nodo
Dim dirs As String() = Directory.GetDirectories(e.Node.Tag)
'Se il nodo non è popolato o vi è stato
'precedentemente un errore ripopola i sottonodi
If e.Node.Nodes.Count = 1 AndAlso _
(e.Node.Nodes(0).Tag = "dummy" OrElse _
e.Node.Nodes(0).Tag = "errore") Then
'Rimuove il nodo dummy (o quello dell'errore)
e.Node.Nodes.RemoveAt(0)
'Cicla fra le sottodirectory
For Each dir As String In dirs
'Come testo imposta solo il nome della cartella
Dim added As TreeNode = e.Node.Nodes.Add(Path.GetFileName(dir))
'Come tag imposta il percorso completo
added.Tag = dir
'Aggiuge il nodo dummy
added.Nodes.Add(dummy.Clone)
Next
End If
Catch ex As Exception
'Pulisce tutti i sottonodi
e.Node.Nodes.Clear()
'Aggiune un nodo di errore (Tag "errore")
e.Node.Nodes.Add(ex.Message).Tag = "errore"
End Try
TreeView1.EndUpdate()
End Sub
Sub Vadoconfile(ByVal DammiDir As String)
Try
'Pulisce gli elementi della ListView
ListView1.Items.Clear()
' Leggo il file
Dim myDir As DirectoryInfo = New DirectoryInfo(DammiDir)
'Il file della directory
Dim file As FileInfo
'L'oggetto che viene aggiunto
Dim li As ListViewItem
For Each file In myDir.GetFiles
'Aggiunge come testo il nome del file
li = ListView1.Items.Add(file.Name)
'Ottiene l'estensione del file
Dim ext As String = Path.GetExtension(file.Name)
'Se l'icona per il file non è ancora stata caricata lo fa:
If Not loadedIcons.ContainsKey(ext) Then
'Estrae l'icona associata al file
Dim iconHandle As IntPtr = _
ExtractAssociatedIcon(IntPtr.Zero, file.FullName, 0)
Dim img As Image = Icon.FromHandle(iconHandle).ToBitmap()
'Aggiunge l'icona all'elenco dell'ImageList
li.ImageList.Images.Add(ext, img)
'Aggiunge l'estensione all'elenco di quelle caricate
loadedIcons.Add(ext, iconHandle)
End If
'Imposta l'icona da visualizzare
li.ImageIndex = li.ImageList.Images.IndexOfKey(ext)
Next
Catch ex As Exception
End Try
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Ottiene i file dal percorso completo
'(che avevamo salvato nel Tag del nodo)
Vadoconfile(TreeView1.SelectedNode.Tag)
End Sub
'Prima di chiudere la finestra chiama questo metodo che
'rilasia le risorse usate dalle Icon caricate
Sub Clean()
'Distrugge l'handle di sistema di ogni icona
For Each hIcon As IntPtr In loadedIcons.Values
DestroyIcon(hIcon)
Next
'Pulisce l'elenco delle icone caricate
loadedIcons.Clear()
End Sub