Page 1 sur 1
[R] Boucle récursive
Posté : ven. 02 nov. 2007 15:47
par XcessiV
Bonjour tout le monde !
Voila, je voudrais (dans un premier temps) arriver à lister tous les dossier d'un repertoire ainsi que tous les dossiers enfants...
Voila ce que j'ai fait :
Code : Tout sélectionner
#include <GUIConstants.au3>
#include <File.au3>
#Include <Array.au3>
$fenetre = GUICreate("Navigation C:", 350, 215)
$treeview = GUICtrlCreateTreeView(5, 5, 175, 205)
LISTAGE("c:",$treeview)
GUISetState ()
GUISetState(@SW_SHOW,$fenetre)
Sleep(4000)
Func LISTAGE($way,$treeview_int)
$treeview_fils=GUICtrlCreateTreeViewitem($way, $treeview_int)
$FileList=_FileListToArray($way,"*",2)
if $FileList <> 0 Then
For $i = 1 To $FileList[0]
LISTAGE($FileList[$i],$treeview_fils)
Next
EndIf
EndFunc
Là il ne me renvois que le premier enfant et pas les autres...
Vous avez une idée d'où peux venir mon soucis ?
Merci

Posté : dim. 04 nov. 2007 22:09
par sylvanie
Bonsoir,
Ne réinventons pas la roue forcément, fait un run de ceci depuis le répertoire à sonder :
dir /B /S /A:D > liste_ssrep.txt
puis tu lis les infos de ce fichier
Posté : lun. 05 nov. 2007 12:26
par XcessiV
en fait je voudrais pouvoir en faire un treeview, c'est possible avec ta commande ?

Posté : lun. 05 nov. 2007 20:40
par sylvanie
Cette commande ne fait que lister les ss repertoires d'un dossier.
Après il faut créer le treeview en faisant une branche par ss rep
Posté : lun. 05 nov. 2007 23:42
par Tlem
L'utilisation de la commande DIR est certes un chose simple, mais présente le désavantage de lister les fichiers en OEM.
Il faut donc ensuite convertir le fichier en ANSI, pour pouvoir le lire à partir de Windows ...
En ce qui me concerne, je n'ai pas réinventer la roue non plus, et j'utilise un UDF tout fait par randallc du forum Anglais.
Je n'ai plus le lien, mais il suffit de chercher après : _FileListToArrayNew2h.au3
Cet UDF permet des tas de possibilités de recherche, et me semble le plus rapide du forum Anglais.
Posté : mar. 06 nov. 2007 19:25
par sylvanie
C'est vrai que le dir a ce désagrément ...
je viens de retrouver aujourd'hui un petit exple proche de ce que tu veux faire (enfin je pense ...)
c'est un prog qui liste les rep (en non récursif cette fois, faudra adapter) de C: puis en cochant les cases (c'est un ree view à case), j'update un écran à gauche avec les noms de fichiers contenu dans les rep cochés.
C'est du tout fait sur l'étagère, malheureusement pas commenté, mais bon si ça peut aider.
c'est toujours avec un dir à la base, après chois la méthode que tu préfères. Au dépard, faut double cliquer sur l'icone C:
Code : Tout sélectionner
#include <WindowsConstants.au3>
#include <GuiTreeView.au3>
#include <Constants.au3>
#include <GUIConstants.au3>
Opt ( "GUIOnEventMode" , 1 ) ; Change to OnEvent mode $rep = 'C:\'
$commande = 'dir /B /A:D'
$commande_subdir = 'dir /B /A: - D'
$dir = ""
$to_print = ""
$ligne = Run ( @ComSpec & ' /c ' & $commande , $rep , @SW_HIDE , $STDERR_CHILD + $STDOUT_CHILD )
While 1
$dir & = StdoutRead ( $ligne )
If @error Then ExitLoop
Wend
$tab_dir = StringSplit ( $dir , @CRLF , 1 )
If $tab_dir[$tab_dir[0]]="" Then $tab_dir[0] -= 1
Dim $tab_ctrl_item[$tab_dir[0] + 1]
Dim $old_state_item[$tab_dir[0] + 1]
$h_GUI = GUICreate ( "TreeView UDF Sample" , 840 , 510 )
GUISetOnEvent ( $GUI_EVENT_CLOSE , "CLOSEClicked" )
$treeview = GUICtrlCreateTreeView ( 10 , 10 , 400 , 485 , BitOr ( $TVS_CHECKBOXES , $TVS_HASLINES , $TVS_LINESATROOT ) , $WS_EX_CLIENTEDGE )
$root1 = GUICtrlCreateTreeViewItem ( $rep , $treeview )
GUICtrlSetImage ( - 1 , "shell32.dll" , 3 , 4 )
GUICtrlSetImage ( - 1 , "shell32.dll" , 4 , 2 )
GUICtrlSetOnEvent ( - 1 , "sub_dir" )
$tab_ctrl_item[0] = $root1
$old_state_item[0] = BitAND ( GUICtrlRead ( - 1 ) , $GUI_CHECKED )
For $indice = 1 to $tab_dir[0]
$tab_ctrl_item[$indice] = GUICtrlCreateTreeViewItem ( $tab_dir[$indice] , $root1 )
GUICtrlSetOnEvent ( - 1 , "sub_dir" )
$old_state_item[$indice] = BitAND ( GUICtrlRead ( - 1 ) , $GUI_CHECKED )
Next
$view = GUICtrlCreateList ( $to_print , 420 , 10 , 400 , 485 , BitOR ( $LBS_NOSEL , $WS_VSCROLL ) )
GUISetState ( )
While 1
sleep ( 100 )
WEnd
Exit
Func sub_dir ( )
local $item = GUICtrlRead ( $treeview )
local $state = BitAND ( GUICtrlRead ( $item ) , $GUI_CHECKED )
local $ind
local $local_err = 1
For $ind = 0 to $tab_dir[0]
If $tab_ctrl_item[$ind] = $item Then $local_err = 0
ExitLoop
EndIf
Next
If $local_err = 1 Then MsgBox ( 16 , "Erreur" , "Erreur de recouvrement d'indice" )
Return
EndIf
bonne chance
Posté : mer. 07 nov. 2007 12:31
par Voodoo
Si sa peut étre utile: voila un moteur d'indexation avec boucle recursive. Il suffit de traiter le fichier txt pour un affichage en treeview.
Code : Tout sélectionner
#Include <File.au3>
#Include <Array.au3>
Global $Depla
$scriptdir = @ScriptDir
ProgressOn ( "Indexation...." , "Veuillez patienter svp" , "0 percent" )
FileDelete ( "index.ini" )
FileDelete ( "index.txt" )
$FileList = _FileListToArray ( $scriptdir , "*.*" , 1 )
If ( Not IsArray ( $FileList ) ) And ( @error = 1 ) Then
MsgBox ( 0 , "" , "Pas de Fichier" )
Else
For $i = 0 To $FileList[0]
FileWriteLine ( "index.txt" , $scriptdir & "\" & $FileList[$i] )
Next
EndIf
$FileList = _FileListToArray ( $scriptdir , "*.*" , 2 )
If ( Not IsArray ( $FileList ) ) And ( @error = 1 ) Then
MsgBox ( 0 , "" , "Pas de Fichier" )
Exit
EndIf
For $i = 0 To $FileList[0]
IniWrite ( "index.ini" , "Contenue" , $i , $FileList[$i] )
Next
$Fin = IniRead ( "index.ini" , "Contenue" , "0" , 0 )
$Dos = StringSplit ( $scriptdir , "\" )
IniWrite ( "index.ini" , "Repertoire" , "Rep" , $Dos[$Dos[0]] )
For $Compte = 1 To $Fin
ProgressSet ( Int ( $Compte * 100 / $Fin ) , Int ( $Compte * 100 / $Fin ) & " percent" )
sousdossier ( $Compte )
Next
FileDelete ( "index.ini" )
Func sousdossier ( $Lieu )
$Depla = IniRead ( "index.ini" , "Contenue" , $Lieu , 0 )
$chemin = $scriptdir & "\" & $Depla
$Fichier = _FileListToArray ( $chemin , "*.*" , 1 )
If $Fichier = 0 Then Return
Liste_Dossier ( $chemin )
Return
EndFunc ; == >sousdossier
Func Liste_Dossier ( $chemin )
$File = _FileListToArray ( $chemin , "*.*" , 1 )
If $File = 0 Then
Else
For $k = 1 To $File[0]
FileWriteLine ( "index.txt" , $chemin & "\" & $File[$k] )
Next
EndIf
$Dossier = _FileListToArray ( $chemin , "*.*" , 2 )
If ( Not IsArray ( $FileList ) ) And ( @error = 1 ) Then
Return
EndIf
If $Dossier = 0 Then Return
For $A = 1 To $Dossier[0]
$Depla = $Dossier[$A]
Liste_Dossier ( $chemin & "\" & $Dossier[$A] )
Next
Return
EndFunc ; == >Liste_Dossier
Le dossier a indexé est défini par $scriptdir, fait maison peut etre buggué :/