Page 1 sur 1
[R] Arborescence à partir d'un dossier
Posté : jeu. 17 juin 2010 12:56
par Gnifrus
Bonjour,
Je me permets de faire encore appel à la communauté, car je bloque sur le problème suivant :
Je souhaite afficher toute l'arborescence d'un dossier, avec ses n sous-dossiers et les fichiers contenus dans chacun d'entre eux.
Bien entendu, je ne connais pas à l'avance la "profondeur" de la recherche.
Plus tard, j'intégrerai très certainement cette recherche dans un TreeView, avec des checkbox et tout le tsouin-tsouin, mais ce n'est pas le but pour l'instant.
J'ai bien essayé de décortiquer le script "ShellTristateTreeView.au3", mais sans succès, car il fait trop de choses, et je ne comprends pas bien le cheminement du script, tant les variables sont nombreuses.
Pour résumer, je ne recherche pas forcément un script tout écrit, mais une méthode, des indices, ou des pistes pour alimenter ma réflexion que je mène depuis quelques jours...
Je pense qu'il vaut mieux que je commence par là, puis par la suite, j'essaierai de représenter tout ça dans une TreeView, puis j'ajouterai des checkboxs, avec lequels je pourrai supprimer des fichiers ou dossiers....etc....
Je remercie à l'avance ceux ou celles qui voudraient perdre un peu de leur temps pour m'aider,
Bonne journée,
Gnifrus.
Re: [..] Arborescence à partir d'un dossier
Posté : jeu. 17 juin 2010 14:09
par Dididj
Avec FileFindFirstFile et FileFindNextFile tu devrais surement trouver ton bonheur mais
tu devras créer le TreeView toi même.
Il y a aussi FileSelectFolder mais je ne pense pas que ça corresponde à tes besoins.
Re: [..] Arborescence à partir d'un dossier
Posté : jeu. 17 juin 2010 14:46
par ZDS
Bonjour !
Si c'est pour un parcours direct de l'arborescence, Dididj t'a orienté dans la bonne direction.
Si c'est en terme de représentation (et donc d'algorithmique) que tu as besoin d'aide, voici un script récursif qui te représente une arborescence en un tableau de tableau de tableau de ... tableau ^^ A toi ensuite de parcourir cette SdD pour en faire ce que tu veux (un treeview, un log, un graphe, etc...) au fur et à mesure :
► Afficher le texteAlgorithme de parcours d'arborescence
Code : Tout sélectionner
#include <Array.au3>
#include <Math.au3>
#include <File.au3>
Func parcourirDossier($folder, $filter="*", $depth=-1)
Local $resultat[1][2] = [[0,$folder]]
If Int($depth) > 0 Then
ConsoleWrite($folder&@CRLF)
Local $subFolders = _FileListToArray($folder,"*",2)
If Not @error Then
For $i = 1 To $subFolders[0]
ajouterValeurDansSdd($resultat, $folder&"\"&$subFolders[$i],parcourirDossier($folder&"\"&$subFolders[$i],$filter,_Max($depth-1,-1)))
Next
EndIf
Local $subFiles = _FileListToArray($folder,$filter,1)
If Not @error Then
For $i = 1 To $subFiles[0]
ajouterValeurDansSdd($resultat, $folder&"\"&$subFiles[$i],"")
Next
EndIf
EndIf
Return $resultat
EndFunc
Func ajouterValeurDansSdd(ByRef $array, $value0,$value1)
$array[0][0] = $array[0][0]+1
ReDim $array[$array[0][0]+1][2]
$array[$array[0][0]][0] = $value0
$array[$array[0][0]][1] = $value1
EndFunc
Local $sdd0 = parcourirDossier("C:\wamp","*",3)
_ArrayDisplay($sdd0,$sdd0[0][1])
For $i = 1 To $sdd0[0][0]
If IsArray($sdd0[$i][1]) Then
Local $sdd1 = $sdd0[$i][1]
_ArrayDisplay($sdd1,$sdd1[0][1])
For $j = 1 To $sdd1[0][0]
If IsArray($sdd1[$j][1]) Then
Local $sdd2 = $sdd1[$j][1]
_ArrayDisplay($sdd2,$sdd2[0][1])
Else
MsgBox(0,"File",$sdd1[$j][0])
EndIf
Next
MsgBox(0,"File",$sdd0[$i][0])
EndIf
Next
Exemple d'application de l'algo précédent à un parcours de C: en profondeur 3 (pas plus loin que 3 niveaux d'arborescence pour pas bouffer trop de mémoire) :
► Afficher le texteAlgorithme de parcours d'arborescence
Code : Tout sélectionner
#include <Array.au3>
#include <Math.au3>
#include <File.au3>
#include <GUIConstantsEx.au3>
Func parcourirDossier($sdd, $folder, $filter="*", $depth=-1)
If Int($depth) > 0 Then
Local $subFolders = _FileListToArray($folder,"*",2)
If Not @error Then
For $i = 1 To $subFolders[0]
parcourirDossier(GUICtrlCreateMenu($subFolders[$i],$sdd),$folder&"\"&$subFolders[$i],$filter,_Max($depth-1,-1))
Next
EndIf
GUICtrlCreateMenuItem("",$sdd)
Local $subFiles = _FileListToArray($folder,$filter,1)
If Not @error Then
For $i = 1 To $subFiles[0]
GUICtrlCreateMenuItem($subFiles[$i],$sdd)
Next
EndIf
EndIf
EndFunc
$GUI = GUICreate("Test",150,100)
$boutonArbo = GUICtrlCreateButton("clique droit",5,5,140,40)
Global $contexte = GUICtrlCreateContextMenu($boutonArbo)
parcourirDossier($contexte,"c:","*",3)
GUISetState(@SW_SHOW,$GUI)
While GUIGetMsg() <> $GUI_EVENT_CLOSE
Sleep(100)
WEnd
Re: [..] Arborescence à partir d'un dossier
Posté : jeu. 17 juin 2010 14:58
par Gnifrus
Merci à Dididj et ZDS pour votre aide !
Je connaissais déjà les fonctions FileFindFirstFile et FileFindNextFile, mais le problème était que je n'arrivais pas à "entrer" dans les sous-dossiers, sur n profondeur...
J'ai bien essayé de tester si le fichier trouvé au moyen de FileFindNextFile était un répertoire (grâce à la fonction FileGetAttrib), afin de savoir si je devais de nouveau entrer dedans pour recommencer un FileFindFirstFile et FileFindNextFile, mais ça devient vite galère à gérer, car il faut revenir en arrière après..etc...
Bref, la solution donnée par ZDS correspond plus à ce que je cherche à faire.
Reste maintenant à décortiquer tout ça et d'essayer de comprendre.
C'est pourquoi je laisse encore ce topic ouvert quelques temps.
Merci en tout cas à tous les 2,
C'est sympa d'aider les autres (moi, j'en suis pas encore là, hélas.....

)
Re: [..] Arborescence à partir d'un dossier
Posté : jeu. 17 juin 2010 16:20
par Gnifrus
Euh.....je reviens à la charge....
Je ne comprends pas à quoi correspond $resultat[1][2]=[[0,$folder]] ?
Apparemment, c'est un tableau à 2 dimensions (1 colonnes sur 2 lignes), mais on stocke quoi ? Le couple [0,"C:\wamp"] ? Dans quel but ?
Merci encore...
Gnifrus.
Re: [..] Arborescence à partir d'un dossier
Posté : jeu. 17 juin 2010 18:24
par ZDS
Pour le [1][2] (une ligne sur deux colonnes), c'est l'initialisation de la SdD symbolisant l'endroit où tu en es, c'est à dire "pour le moment, 0 résultat dans $folder"; c'est de la redondance d'information, pas forcément utile. Comme on dit dans le jargon enssatien, c'est la mise en place de l'invariant

Oui, c'est un tableau à 2 entrées , la première ligne n°0 correspond à :
[ nombre d'items trouvés (dossier + fichiers) ; nom du dossier en cours de parcours ]
Les suivantes de 1 à n sont aussi des couples :
[ nom du fichier ; chaine vide ]
dans le cas d'un dossier
[ nom du dossier ; sous-tableau ]
dans le cas d'un dossier
Et c'est là la subtilité : le sous-tableau est lui même un tableau ! Comme un sous-ensemble qui est lui-même un ensemble.
Mais bon, je te conseille plutôt de te baser sur le second script, il est un peu plus explicite et ne se base que sur un tableau à une dimension (même pas, puisqu'il y a pas de tableau).
Re: [..] Arborescence à partir d'un dossier
Posté : ven. 18 juin 2010 10:06
par Gnifrus
Merci encore,
J'ai compris, dans l'ensemble, le déroulement du script, mais je n'aurais jamais pu faire ça tout seul !
Enfin, un jour peut-être ?
Merci de ton aide,
@bientôt, (ça, j'en suis à peu prêt sûr !)
Gnifrus