Tout d'abord, explorons notre arborescence avec une commande tout faite dans notre invite de commande Windows.
La commande shell (commande spécifique à Windows) s'appelle
Tree. Elle donne un résultat de ce genre :
Vous n'avez pas besoin d'utiliser cette commande c'est pour vous montrer l'arborescence du dossier dans lequel nous allons faire notre mini-tp.
Nous allons donc retrouver notre arborescence de manière a se retrouver avec le même schéma, le tout grâce a un algorithme.
Je vous ai déjà parlés du principe d'un algorithme. Eh bien nous allons devoir en trouver un pour pouvoir effectuer ce listage.
Nous récupérerons les informations et les afficherons dans un TreeView (ça vous donnera l'occasion de découvrir un nouveau contrôle), spécifiquement conçu pour effectuer des arborescences (avec des parents et des enfants).
Pour résumer, dans le TreeView : un dossier correspondra à un noeud principal (on peut cliquer dessus pour le "déplier") et un fichier sera un noeud simple, pas de possibilité de le "dérouler".
C'est un programme très basique, sa base pourra être utilisée dans d'autres programmes qui nécessitent une exploration des répertoires.
Donc passons à l'algorithme. Je ne suis pas là pour vous apprendre les rudiments et normes de l'algorithmie, j'aimerai juste un peu de logique de votre part, peu importe comment vous vous représentez ce qu'il va y avoir à faire (schéma, texte, dessin, ...).
Le tout est de comprendre ce qu'on va devoir effectuer comme action, appeler comme fonctions.
Un algorithme version texte tout simple :
Parcourir le répertoire, pour chaque dossier ajouter un noeud principal, pour chaque fichier ajouter un noeud simple.
Répéter cette action pour chaque répertoire
(Attention, cet algorithme ne respecte pas les normes de l'algorithme, si vous voulez en savoir plus, de très bon tutos existent sur le SDZ)
Maintenant il va falloir l'adapter pour le rentrer dans notre code.
Le code VB :
Code : VB.NET 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 | Imports System.IO
Public Class Form1
Const RepertoireALister As String = "."
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Définit le premier noeud
Me.TV_ARBORESCENCE.TopNode = Me.TV_ARBORESCENCE.Nodes.Add(RepertoireALister, RepertoireALister)
'Arborescence du premier noeud
For Each Repertoire As String In Directory.GetDirectories(RepertoireALister)
Me.TV_ARBORESCENCE.TopNode.Nodes.Add(Repertoire, Path.GetFileName(Repertoire))
'Récursif
ListeArborescenceDossier(Repertoire, Me.TV_ARBORESCENCE.TopNode)
Next
'Fichiers du premier noeud
For Each Fichier As String In Directory.GetFiles(RepertoireALister)
Me.TV_ARBORESCENCE.TopNode.Nodes.Add(Path.GetFileName(Fichier))
Next
End Sub
Sub ListeArborescenceDossier(ByVal RepertoireActuel As String, ByVal NodeActuel As TreeNode)
'Recupère le node dans lequel on est
Dim Node As TreeNode = NodeActuel.Nodes(RepertoireActuel)
'Répertoires de ce noeud
For Each Repertoire As String In Directory.GetDirectories(RepertoireActuel)
Node.Nodes.Add(Repertoire, Path.GetFileName(Repertoire))
'Récursif
ListeArborescenceDossier(Repertoire, Node)
Next
'Fichiers de ce noeud
For Each Fichier As String In Directory.GetFiles(RepertoireActuel)
Node.Nodes.Add(Path.GetFileName(Fichier))
Next
End Sub
End Class
|
Expliquons un peu le tout. Tout d'abord Node en anglais signifie Nœud.
Tout d'abord, le répertoire que je dois explorer en constante, vous pouviez bien évidemment créer une textbox demandant à l'utilisateur quel dossier lister. Le path que j'ai utilisé est "." cela signifie le dossier courant, c'est un
Path Relatif.
Vient le load, je crée d'office un
TopNode autrement dit "le nœud le plus haut", le nœud principal de notre
treeview. J'en profite pour créer un noeud avec :
Me.TV_ARBORESCENCE.Nodes.Add(). En premier argument de cette fonction la "clé" pour identifier le nœud dans le treeview, cette clé doit avoir un nom
unique, et en second le texte qui sera affiché sur mon nœud.
Ensuite, la petite boucle que je vous ai montrée plus haut : je parcours tout les répertoires dans le répertoire à lister, je les ajoute en tant que nœud principal avec comme clé leur path entier (exemple : "./Dossier1/SousDossier1") donc un nom qui est unique, et en texte le nom du dossier simplement. Nom de dossier que j'ai récupéré en utilisant la classe
Path qui donne des méthodes et fonction pour manipuler les chemins. J'ai utilisé la fonction
GetFileName qui renvoie le nom du fichier ou le nom d'un dossier contenu dans un Path.
Puis j'appelle une méthode que je vous exposerai juste après.
Quand il n'y a plus de dossiers on passe aux fichiers, sur le même principe sauf que ces nœuds n'auront pas de nœud enfants. Donc pas dépliables.
La méthode que j'ai mise juste après, eh bien c'est elle qui va nous permettre d'effectuer la récursivité de notre algorithme à travers tous les sous dossiers.
Sans elle, on aurait seulement le niveau 0 de notre arborescence de listé (les dossiers et fichiers du répertoire principal) et pas plus loin.
Eh bien pour ce qui est de la fonction, elle effectue exactement la même chose que ce que je viens d'expliquer mais où le nom du répertoire et le nœud dans lequel on se trouve actuellement sont passés en paramètres de façon à permettre de la rappeler dynamiquement et pour qu'elle puisse s'adapter aux différents niveaux de l'arborescence.
Résultat :
Je tiens juste à vous dire que si vous prenez un peu de temps, essayez de comprendre le fonctionnement de ce programme étape par étape (commencez par un seul niveau d'arborescence), vous allez comprendre la démarche qu'il effectue et ce sera un premier et un grand pas vers de notions de programmation plus complexe que nous allons aborder dans la partie 3 de ce tutoriel.
Autre conseil pour vous éclairer le programme : créez des variables intermédiaires dans lesquelles vous vous habituerez à trouver le bon type de variable à employer, les méthodes disponibles sur ce type, pour finalement arriver à tout rassembler tout en le laissant clair à vos yeux.