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 :oops:

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 ? :oops:

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é :/