[R] Boucle récursive

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
XcessiV
Niveau 4
Niveau 4
Messages : 53
Enregistré le : mar. 07 août 2007 14:05
Localisation : Grenoble
Status : Hors ligne

[R] Boucle récursive

#1

Message 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:
:) Merci à la AutoIt French Team pour son aide :)
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#2

Message 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
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
XcessiV
Niveau 4
Niveau 4
Messages : 53
Enregistré le : mar. 07 août 2007 14:05
Localisation : Grenoble
Status : Hors ligne

#3

Message par XcessiV »

en fait je voudrais pouvoir en faire un treeview, c'est possible avec ta commande ? :oops:
:) Merci à la AutoIt French Team pour son aide :)
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#4

Message 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
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11773
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

#5

Message 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.
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
sylvanie
Niveau 11
Niveau 11
Messages : 1550
Enregistré le : jeu. 26 juil. 2007 21:31
Localisation : Paris
Status : Hors ligne

#6

Message 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
Toi qui cherche à mettre le doigt sur la solution, appuie sur F1.
Avatar du membre
Voodoo
Niveau 6
Niveau 6
Messages : 298
Enregistré le : ven. 20 juil. 2007 20:45
Status : Hors ligne

#7

Message 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é :/
Répondre