none
VB.NET Treeview complet du disque local (C:\) RRS feed

  • Question

  • Bonjour,

    Je suis débutant en VB.NET, toujours en cours d'apprentissage.

    Voila j'essaye de de faire un treeview qui déploie le "Disque local (C) avec le contenu des dossiers et sous dossiers.
    J'ai trouvé un script sur des forum (peut être ici d'ailleurs) qui affiche une arborescence et qui liste dans une listview le contenu du dossier sélectionné, exactement ce que je cherche même si je ne comprends pas tout le code.
    Problème il n'affiche pas le C:\
    Voici le code:

    Imports System.IO
    Public Class Form1
     
        Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
     
        End Sub
     
        Private Sub PopulateTreeView()
            Dim rootNode As TreeNode
     
            Dim info As New DirectoryInfo("../..")
     
     
            If info.Exists Then
     
                rootNode = New TreeNode(info.Name)
                rootNode.Tag = info
                GetDirectories(info.GetDirectories(), rootNode)
                TreeView1.Nodes.Add(rootNode)
            End If
     
        End Sub
     
        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
     
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            For Each subDir In subDirs
                aNode = New TreeNode(subDir.Name, 0, 0)
                aNode.Tag = subDir
                aNode.ImageKey = "folder"
                subSubDirs = subDir.GetDirectories()
                If subSubDirs.Length <> 0 Then
                    GetDirectories(subSubDirs, aNode)
                End If
                nodeToAddTo.Nodes.Add(aNode)
            Next subDir
     
        End Sub
     
        Public Sub New()
            InitializeComponent()
            PopulateTreeView()
     
        End Sub 'New
     
        Private Sub treeView1_NodeMouseClick(ByVal sender As Object, ByVal e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
     
            Dim newSelected As TreeNode = e.Node
            ListView1.Items.Clear()
            Dim nodeDirInfo As DirectoryInfo = CType(newSelected.Tag, DirectoryInfo)
            Dim subItems() As ListViewItem.ListViewSubItem
            Dim item As ListViewItem = Nothing
     
            Dim dir As DirectoryInfo
            For Each dir In nodeDirInfo.GetDirectories()
                item = New ListViewItem(dir.Name, 0)
                subItems = New ListViewItem.ListViewSubItem() {New ListViewItem.ListViewSubItem(item, "Directory"), New ListViewItem.ListViewSubItem(item, _
                    dir.LastAccessTime.ToShortDateString())}
     
                item.SubItems.AddRange(subItems)
                ListView1.Items.Add(item)
            Next dir
            Dim file As FileInfo
            For Each file In nodeDirInfo.GetFiles()
                item = New ListViewItem(file.Name, 1)
                subItems = New ListViewItem.ListViewSubItem() {New ListViewItem.ListViewSubItem(item, "File"), New ListViewItem.ListViewSubItem(item, _
                    file.LastAccessTime.ToShortDateString())}
     
                item.SubItems.AddRange(subItems)
                ListView1.Items.Add(item)
            Next file
     
            ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
     
        End Sub
     
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
     
        End Sub
    End Class

    Le code tel quel affiche l'arborescence du programme courant, c'est à dire du WindowsApplication1.
    J'ai essayé de remplacé dans le code (../..) par (C:\) mais il me met le message d'erreur suivant:

    Depuis mon PC maison:
    "Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : L'accès au chemin d'accès 'C:\$Recycle.Bin\S-1-5-20' est refusé."

    Depuis mon PC Professionnel
    Une erreur s'est produite lors de la création du formulaire. Pour plus d'informations, consultez Exception.InnerException. L'erreur est : L'accès au chemin d'accès 'C:\Document and setting' est refusé. (alors que je suis sous W7 et administrateur de mon poste).

    En remplaçant "../.." par "../../../.." ça me met le desktop mais avec seulement mes dossiers et fichiers et pas mes raccourci comme "ordinateur" qui correspond au "c:\".
    Je précise que je suis admin de mes pc
    merci de m'aider.

    lundi 7 avril 2014 10:05

Réponses

  • Bonjour,

    Dans ce il suffit d'ignorer les répertoires systèmes et cachés :

        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
    
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            For Each subDir In subDirs
    
                ' Si le répertoire est un répertoire système, l'ignorer
                If (subDir.Attributes And FileAttributes.System) = FileAttributes.System Then
                    Continue For
                End If
    
                ' Si le répertoire est un répertoire caché, l'ignorer
                If (subDir.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
                    Continue For
                End If
    
                aNode = New TreeNode(subDir.Name, 0, 0)
                aNode.Tag = subDir
                aNode.ImageKey = "folder"
                Try
                    subSubDirs = subDir.GetDirectories()
                Catch e As UnauthorizedAccessException
                    subSubDirs = Nothing
                End Try
                If Not subSubDirs Is Nothing Then
                    If subSubDirs.Length <> 0 Then
                        GetDirectories(subSubDirs, aNode)
                    End If
                End If
                nodeToAddTo.Nodes.Add(aNode)
            Next subDir
    
        End Sub

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse Aurel Bera lundi 14 avril 2014 06:32
    mercredi 9 avril 2014 00:03
    Modérateur

Toutes les réponses

  • Personne verser m'aider?

    S'il vous plaît.

    lundi 7 avril 2014 19:57
  • Bonjour,

    L'algorithme que vous utilisez explore tous les répertoires y compris ceux que votre application n'a pas les droits pour y accéder.

    Utilisez donc un bloc Try/Catch pour ignorer l'erreur de type UnauthorizedAccessException

    Corriger le code de GetDirectories() comme ceci :

        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
    
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            For Each subDir In subDirs
                aNode = New TreeNode(subDir.Name, 0, 0)
                aNode.Tag = subDir
                aNode.ImageKey = "folder"
                Try
                    subSubDirs = subDir.GetDirectories()
                Catch e As UnauthorizedAccessException
                    subSubDirs = Nothing
                End Try
                If Not subSubDirs Is Nothing Then
                    If subSubDirs.Length <> 0 Then
                        GetDirectories(subSubDirs, aNode)
                    End If
                End If
                nodeToAddTo.Nodes.Add(aNode)
            Next subDir
    
        End Sub

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Proposé comme réponse Aurel Bera mardi 8 avril 2014 08:19
    lundi 7 avril 2014 23:58
    Modérateur
  • Super ça fonctionne, c'est très long mais ça fonctionne.

    Merci beaucoups Gilles.

    Par contre je n'ai pas exactement la même arborescence que lorsque j'ouvre mon "disque local", j'ai certain dossier en plus (qui , je pense, sont les dossiers qui cause l'erreur "UnauthorizedAccessException") comme "$Recycle.bin", "Documents and settings", "Recovery" et "System Volume information".

    Sais tu s'il est possible de ne pas les afficher dans l'arborescence avec je sais pas un genre de condition qui dit,  si tel dossier rencontré ne pas afficher ou passer... ou peut-être un autre chemin pour récupérer le C:

    Désolé pour l'ignorance, je débute dans mon tuto vb.net.

    Merci de ton aide, ou d'une autre âme charitable.

    mardi 8 avril 2014 08:35
  • Bonjour,

    Dans ce il suffit d'ignorer les répertoires systèmes et cachés :

        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
    
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            For Each subDir In subDirs
    
                ' Si le répertoire est un répertoire système, l'ignorer
                If (subDir.Attributes And FileAttributes.System) = FileAttributes.System Then
                    Continue For
                End If
    
                ' Si le répertoire est un répertoire caché, l'ignorer
                If (subDir.Attributes And FileAttributes.Hidden) = FileAttributes.Hidden Then
                    Continue For
                End If
    
                aNode = New TreeNode(subDir.Name, 0, 0)
                aNode.Tag = subDir
                aNode.ImageKey = "folder"
                Try
                    subSubDirs = subDir.GetDirectories()
                Catch e As UnauthorizedAccessException
                    subSubDirs = Nothing
                End Try
                If Not subSubDirs Is Nothing Then
                    If subSubDirs.Length <> 0 Then
                        GetDirectories(subSubDirs, aNode)
                    End If
                End If
                nodeToAddTo.Nodes.Add(aNode)
            Next subDir
    
        End Sub

    Cordialement


    Gilles TOURREAU - MVP C#
    Architecte logiciel/Consultant/Formateur Freelance - P.O.S Informatique
    Blog : http://gilles.tourreau.fr - Suivez-moi sur Twitter
    - MCPD : Enterprise Developper / Windows Developper 3.5 / ASP .NET 3.5/4.0
    - MCSA : SQL Server 2012
    - MCITP : SQL Server 2008 Developper
    - MCTS : ADO .NET 3.5 / SQL Server 2008 Developper / Windows Forms 3.5 / ASP .NET 3.5/4.0 / TFS 2010 / Windows Azure

    • Marqué comme réponse Aurel Bera lundi 14 avril 2014 06:32
    mercredi 9 avril 2014 00:03
    Modérateur
  • Bonjour

    Un petit retour SVP?

    Merci!

    Cordialement,


    Aurel BERA, MSFT
    MSDN Community Support. LE CONTENU EST FOURNI "TEL QUEL" SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE.
    S'il vous plaît n'oubliez pas de "Marquer comme réponse" les réponses qui ont résolu votre problème. C'est une voie commune pour reconnaître ceux qui vous ont aidé, et rend plus facile pour les autres visiteurs de trouver plus tard la résolution.

    jeudi 10 avril 2014 08:51
  • Bonjour,

    Désolé j'étais parti en vacance 3 semaines aux Etats Unis.

    Donc, j'avais eu juste avant ta réponse une réponse sur un autre forum qui fonctionne très bien et qui me permet d'avoir un affichage très rapide de l'arborescence (il était vraiment très long avant).

    voici le code:

        Private Sub PopulateTreeView()
            Dim rootNode As TreeNode
            Dim info As New DirectoryInfo("C:\")
    
            If info.Exists Then
                rootNode = New TreeNode(info.Name)
                rootNode.Tag = info
                rootNode.Expand()
                GetDirectories(info.GetDirectories(), rootNode)
                TreeView1.Nodes.Add(rootNode)
            End If
        End Sub
    
        Private Sub GetDirectories(ByVal subDirs() As DirectoryInfo, ByVal nodeToAddTo As TreeNode)
    
            Dim aNode As TreeNode
            Dim subSubDirs() As DirectoryInfo
            Dim subDir As DirectoryInfo
            nodeToAddTo.Nodes.Clear() ' vider avant de construire
            For Each subDir In subDirs
                aNode = New TreeNode(subDir.Name, 0, 0)
                aNode.Tag = subDir
    
                Me.AddFakeNode(aNode)
    
                Try
                    subSubDirs = subDir.GetDirectories()
                Catch e As UnauthorizedAccessException
                    subSubDirs = Nothing
                End Try
    
                If Not subDir.Attributes = (FileAttributes.Hidden Or subDir.Attributes) Then
                    nodeToAddTo.Nodes.Add(aNode)
                End If
            Next subDir
        End Sub
    
        Private Sub AddFakeNode(ByVal nodeToAddTo As TreeNode)
            ' On ajoute le noeud fantome pour afficher le signe +
            nodeToAddTo.Nodes.Insert(0, New TreeNode(String.Empty))
        End Sub
    
        Private Sub RemoveFakeNode(ByVal nodeToRemoveFrom As TreeNode)
            ' On supprime le noeud fantome
            nodeToRemoveFrom.Nodes.RemoveAt(0)
        End Sub
    
        Private Sub TreeView1_BeforeExpand(ByVal sender As Object, ByVal e As TreeViewCancelEventArgs)
            RemoveFakeNode(e.Node)
            ' On charge le premier niveau de dossiers pour le noeud en cours de traitement
            Dim di As New DirectoryInfo(e.Node.FullPath)
            GetDirectories(di.GetDirectories(), e.Node)
        End Sub
    
        Public Sub New()
            InitializeComponent()
            PopulateTreeView()
        End Sub 'New
    
        Private Sub showCheckedNodesButton_Click(ByVal sender As Object, ByVal e As EventArgs)
            ' Disable redrawing of treeView1 to prevent flickering 
            ' while changes are made.
            treeView1.BeginUpdate()
            ' Collapse all nodes of treeView1.
            treeView1.CollapseAll()
            ' Add the CheckForCheckedChildren event handler to the BeforeExpand event.
            AddHandler treeView1.BeforeExpand, AddressOf CheckForCheckedChildren
            ' Expand all nodes of treeView1. Nodes without checked children are 
            ' prevented from expanding by the checkForCheckedChildren event handler.
            treeView1.ExpandAll()
            ' Remove the checkForCheckedChildren event handler from the BeforeExpand 
            ' event so manual node expansion will work correctly.
            RemoveHandler treeView1.BeforeExpand, AddressOf CheckForCheckedChildren
            ' Enable redrawing of treeView1.
            treeView1.EndUpdate()
        End Sub 'showCheckedNodesButton_Click
    
        ' Prevent expansion of a node that does not have any checked child nodes.
        Private Sub CheckForCheckedChildren(ByVal sender As Object, ByVal e As TreeViewCancelEventArgs)
            If Not HasCheckedChildNodes(e.Node) Then
                e.Cancel = True
            End If
        End Sub 'CheckForCheckedChildren
    
        ' Returns a value indicating whether the specified 
        ' TreeNode has checked child nodes.
        Private Function HasCheckedChildNodes(ByVal node As TreeNode) As Boolean
            If node.Nodes.Count = 0 Then
                Return False
            End If
            Dim childNode As TreeNode
            For Each childNode In node.Nodes
                If childNode.Checked Then
                    Return True
                End If
                ' Recursively check the children of the current child node.
                If HasCheckedChildNodes(childNode) Then
                    Return True
                End If
            Next childNode
            Return False
        End Function 'HasCheckedChildNodes

    Merci de votre aide .

    Par contre j'ai un autre problème qui n'a rien à voir avec le treeview donc je sais pas si je peux continuer ici.

    Voici mon problème: j'essaye de faire une sauvegarde des profiles se trouvant dans le dossier "utilisateurs" mais en ne prenant que les dossiers important comme "bureau", "mes documents", "Favoris", "images"....etc.

    Le problème est qu'il bute sur les dosssiers "ma musique", "mes images" et je pense aussi "mes vidéos" qui se trouvent dans "mes documents" qui sont en fait des "hard link" dossiers protégés.

    J'ai vue qu'il y avait le "File.GetAttributes" avec "If (File.GetAttributes(Users & "\" & NomProfil & "\Documents\Ma Musique") And FileAttributes.ReparsePoint) = FileAttributes.ReparsePoint Then",
    mais j'arrive pas à l'utiliser.
    Je voudrai juste trouver le code qui dit que si le dossier est un dossier caché ou dossier protégé alors il les ignore.

    voici mon code juste pour la copie du dossier "mes documents de chaque profils:

    Dim Profil As String
            Dim Users As String = My.Application.GetEnvironmentVariable("USERPROFILE").Substring(0, My.Application.GetEnvironmentVariable("USERPROFILE").LastIndexOf("\"))
            For Each Profil In System.IO.Directory.GetDirectories(Users)
                Dim di As New DirectoryInfo(Profil)
                Dim NomProfil As String = di.Name
                Dim Profildestination As String = (Drive & NomPC & "\Profils\" & NomProfil & "\")
     
                If Directory.Exists(Users & "\" & NomProfil & "\Documents") Then
     
                    Try
                        My.Computer.FileSystem.CopyDirectory(Users & "\" & NomProfil & "\Documents\", Profildestination & "Documents\", True)
                    Catch erreur As Exception
                        My.Computer.FileSystem.WriteAllText(Drive & NomPC & "\Erreurs.txt", vbCrLf & "-" & erreur.Message & vbCrLf, True)
                    End Try
                End If
            Next

    mardi 13 mai 2014 07:30