[R] Récupérer des noms de fichiers

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Dixit
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 16 mars 2011 13:14
Status : Hors ligne

[R] Récupérer des noms de fichiers

#1

Message par Dixit »

Bonjour. Voila la situation:

J'ai un fichier qu'on va appeler "Omega" et dedans il y à des fichiers txt appelés A, B, C, ... Ces fichiers txt contiennent des données que le programme pourra ainsi récupérer (ca au moins je sais faire :p). Mais au lieu de mettre un inputbox dans mon programme pour choisir quel fichier ouvrir, j'aimerais créer une interface GUI affichant des boutons avec à l'intérieur le nom de chaque sauvegarde A, B, C, etc. pour ainsi juste cliquer sur la sauvegarde qui nous intéresse, ce qui est bien plus simple. Là encore pour l'interface je saurais faire. Mais comment faire pour récupérer tous les noms des fichiers txt contenus dans "Omega" ?

J'ai cherché du côté de FileFindFirstFile et FileFindNextFile mais alors je ne vois pas du tout comment les utiliser. J'ai essayé le petit programme des développeurs pour comprendre mais rien à faire, je le met ici:
► Afficher le texte
Dans le message, on retourne Omega et pas les noms A, B, C... J'y ai passé du temps et je ne comprend vraiment pas, aidez moi svp ^^ Surtout qu'on parle de "handle" dans l'aide, je ne vois pas non plus à quoi cela fait référence.
Modifié en dernier par Dixit le mer. 16 mars 2011 23:05, modifié 3 fois.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#2

Message par GaRydelaMer »

Bonjour


très simple aussi:
relis toi et tu as la solution !!!

1/ Ouvrir le fichier Omega
2/ Lire le contenu (ligne par ligne)
3/ Pour chaque ligne créer le bouton, quand à moi je préfère une listBox ou Combo plus un bouton valider

2/bis/ Petit truc sympa: _FileReadToArray() voir la doc
3/bis/ Parcours du tableau, idem dessus soit des boutons, ou dans une listbox combobox, listview

Code : Tout sélectionner

#include <file.au3>
Dim $aRecords
If Not _FileReadToArray("omega", $aRecords) Then
   MsgBox(4096,"Error", " Error reading log to Array     error:" & @error)
   Exit
EndIf
; Je creer un tableau avec le même nombre d'éléments que de fichier dans "Omega", afin de stocker l'ID du boutons qui correspond
Local $aButtons[$aRecords[0]] =[$aRecords[0]], $left = 10,  $Top = 10
For $i = 1 to $aRecords[0]
    $aButtons[$x] = GUICtrlCreateButton ($aRecords[$i], $left, $top, 50, 30)
    $Left += 40
Next

Ensuite dans ton while tu parcours le tableau $aButtons pour savoir quel bouton est cliqué

PS:
Plus simple avec 1 boutons valide, et une list, (GuiCtrlRead($list) te donneras le texte)
 
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#3

Message par zeshrek »

@ GaRydelaMer, quand il parle de son fichier Omega, en fait il pense a un dossier je crois.

Dixit, si tel est le cas, on peut dire que tu as de la chance !
Pour mon DirInstall j'ai dévelopé 2 fonctions que je pensais publier en UDF si le besoin se faisait sentir. Et je crois que c'est le cas.
Alors ok, j'ai pas encore publié l'UDF mais voici ma solution a ton probleme (Avec la GUI que je t'ai fait tu peux poser jusqu'a 9 colonnes de 30 bouttons soit 270 fichiers dans ton dossier Omega...)
► Afficher le texte
Si vis pacem para bellum
Dixit
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 16 mars 2011 13:14
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#4

Message par Dixit »

zeshrek > Oui c'est exact, "Omega" est bien un dossier et qui contient exclusivement des fichiers txt. Désolé GaRydelaMer je n'ai peut-être pas été assez clair. Merci beaucoup de nous faire partager votre travail de script même s'il semble très ardu pour mon niveau je vais essayer de le comprendre... ^^ Et je vous dirais s'il fonctionne pour mon cas.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#5

Message par GaRydelaMer »

Pas de soucis

par contre ce que j'ai dit pour la suite a partir du tableau reste valable.

De plus il y a une UDF sur la recherche de fichier vers un tableau sur le forum mis à jour très récemment avec une fonction qui marche très rapidement.

http://www.autoitscript.fr/forum/viewto ... f=21&t=479

Voila
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#6

Message par zeshrek »

Argllllllllllllll !!!!
Donc en gros j'ai réinventé le fil a couper l'eau tiède ?
Pfffff.... la loose ! Ca fait déjà au moins 2 ou 3 fois que ca m'arrive !
Si vis pacem para bellum
Dixit
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 16 mars 2011 13:14
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#7

Message par Dixit »

Aie ^^ Cette fonction _RecFileListToArray() à l'air de totalement répondre à ma demande merci pour le lien. Je dois mettre le fichier dans "C://Programmes/Autoit/Include" ou je dois le laisser dans le même fichier que le script?
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#8

Message par GaRydelaMer »

Moi pour mes projets je fais comme ca:

Code : Tout sélectionner

C:\Program Files\AutoIt\Includes

D:\Mes Programmes
  \Sources
       \Includes
       \Projet1
       \Projet2
  \Projet1
  \Projet2
 
Donc je mets mes UDFs dans D:\Mes Programmes\Sources\Includes
Et dans mes projets D:\Mes Programmes\Sources\Projet1\main.au3
je rajoute par exemple

Code : Tout sélectionner

#Region ;**** Include AutoIt                            ****
#include <GUIConstantsEx.au3>
#include <File.au3>
#EndRegion ;**** Include AutoIt                         ****

#Region ;**** Include My UDFs                           ****
#include "..\Includes\UDFs\File.au3"
#EndRegion ;**** Include My UDFs                            ****
Donc j'ai créer un fichier D:\Mes Programmes\Sources\Includes\file.au3
avec le code de la fonction cité, plus d'autres relatives au fichiers.
Dixit
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 16 mars 2011 13:14
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#9

Message par Dixit »

Merci. Finalement le problème n'est pas tout a fait réglé pour moi :S

Me voila donc avec cette fonction _RecFileListToArray. Je ne connais pas encore bien la notion de tableau, c'est la première fois que je m'aventure dans les Array. J'ai fais le bout de code suivant pour voir si ca marchait:
► Afficher le texte
Déjà je m'attendais à ce que ArrayDisplay me fasse apparaître un tableau des noms des fichiers (Display > Déploiement...) et donc voir si sa marchait. Mais non alors finalement à quoi sert cette fonction. Et comment on affiche le tableau?

J'ai donc mis des MsgBox pour essayer de voir les noms. J'ai fais ca car pour un $rep=_FileReadToArray ca aurait marché j'aurais demandé à la msgbox d'afficher $rep[1] et j'aurais eu la ligne 1 du txt scané. Mais ca ne marche pas. Où est le problème svp? Ce que je veux surtout c'est récupérer les noms sous formes de variables, ré-exploitables.
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#10

Message par GaRydelaMer »

Normalement ca marche bien:

_RecFileListToArray($sInitialPath, $sInclude_List = "*", $iReturn = 0, $iRecur = 0, $iSort = 0, $iReturnPath = 1, $sExclude_List = "")

Code : Tout sélectionner

#include<Array.au3>
#include"RecFileListToArray.au3"

Dim $list

$list = _RecFileListToArray(@ScriptDir & "\Sauvegardes", "*.txt", 1, 1, 1)
_ArrayDisplay($list, "Liste fichier dans: " & @ScriptDir & "\Sauvegardes")
Tes fichiers sont bien dans le dossier "Sauvegardes" dans le dossier de ton script ? (@ScriptDir, c'est le dossier ou est ton fichier au3)
Dixit
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 16 mars 2011 13:14
Status : Hors ligne

Re: [..] Récupérer des noms de fichier

#11

Message par Dixit »

Votre script fonctionne. La seule différence est celle-ci:

$list= _RecFileListToArray ( @ScriptDir&"\Sauvegardes", "*.txt",1,2,1,"")

$list= _RecFileListToArray ( @ScriptDir&"\Sauvegardes", "*.txt",1,1,1,"")

L'option de tri 0 = Non trié (défaut), 1 = Trié, le 2 n'existe pas :S Une faute bête.

Merci ! Mon problème est résolu.
Dixit
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 16 mars 2011 13:14
Status : Hors ligne

Re: [R] Récupérer des noms de fichiers

#12

Message par Dixit »

Voilà grâce à votre aide j'ai pu faire un "Navigateur de sauvegardes". On voit les sauvegardes d'un fichier dans des pages avec 10 boutons, chaque bouton pour un fichier. Il suffit de cliquer pour ouvrir ou importer des variables, ce qu'on veut :) On peut se balader de pages en pages avec 2 boutons ">>" et "<<". C'est quand même bien plus pratique et rapide qu'un InputBox! ^^ Je vous laisse ici le script, qui pourrait sans doute être amélioré mais il marche (en bonus un petit affichage en cascade des boutons, oh c'est joli):

Code : Tout sélectionner

; ### NAVIGATEUR DE SAUVEGARDES ### By Dixit

#RequireAdmin
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <File.au3>
#include<Array.au3>
#include"RecFileListToArray.au3"

Hotkeyset("{ESC}","fin")

Dim $list
Dim $Btn[100] ; 100 boutons donc 100 fichiers
Dim $GUI[100] ; Au max 100/10=10 Pages soit 100 fichiers visibles


$list= _RecFileListToArray ( @ScriptDir&"\Sauvegardes","*.txt",1,1,1,"") ; ### A changer selon le nom et l'emplacement du répertoire ###
_ArrayDisplay($list, "Liste fichier")  ; Facultatif

$i=0
While 1
    $GUI[$i] = GUICreate("Navigateur de sauvegardes", 300, 425, -1, -1)
    GUICtrlCreateLabel("Sauvegardes", 24, 20, 120, 24)
    GUICtrlSetFont(-1, 12, 800, 0, "MS Sans Serif")
    GUISetState(@SW_SHOW, $GUI[$i])
    $BtnRight = GUICtrlCreateButton(">>", 150, 360, 125, 40, BitOR($BS_MULTILINE,$BS_FLAT))
    $BtnLeft = GUICtrlCreateButton("<<", 25, 360, 125, 40, BitOR($BS_MULTILINE,$BS_FLAT))
    If $list[0] >= $i+10 Then
        For $x=1 to 10
            $Btn[$x] = GUICtrlCreateButton(""&$list[$x+$i]&"", 25, 30+30*$x, 250, 30, BitOR($BS_MULTILINE,$BS_FLAT))
            Sleep(80) ; Rendu en cascade
        Next
    Else
        For $x=1 to $list[0]-$i
            $Btn[$x] = GUICtrlCreateButton(""&$list[$x+$i]&"", 25, 30+30*$x, 250, 30, BitOR($BS_MULTILINE,$BS_FLAT))
            Sleep(80) ; Rendu en cascade
        Next
    Endif
    If $list[0] > $i+10 Then 
        Guictrlsetstate($BtnRight,$GUI_ENABLE)
    Else
        Guictrlsetstate($BtnRight,$GUI_DISABLE)
    Endif
    If $i >= 10 Then 
        Guictrlsetstate($BtnLeft,$GUI_ENABLE)
    Else
        Guictrlsetstate($BtnLeft,$GUI_DISABLE)
    Endif
    While 1
        $nMsg = GUIGetMsg()
        If $nMsg = $GUI_EVENT_CLOSE Then Exit
        If $nMsg = $BtnRight Then  ; Bouton à droite
            GUISetState(@SW_HIDE, $GUI[$i])
            $i=$i+10
            ExitLoop 
        EndIf
        If $nMsg = $BtnLeft Then ; Bouton à gauche
            GUISetState(@SW_HIDE, $GUI[$i])
            $i=$i-10
            ExitLoop
        EndIf
        If $list[0] >= $i+10 Then ; Si on est pas en fin de liste
            For $x=1 to 10
                If $nMsg = $Btn[$x] Then
                    GUISetState(@SW_HIDE, $GUI[$i])
                    FileOpen(@ScriptDir&"\Sauvegardes\"&$list[$x+$i]) ; ### A changer selon le nom et l'emplacement du répertoire ###
                    ExitLoop 3
                Endif
            Next
        Else ; Si on est en fin de liste
            For $x=1 to $list[0]-$i
                If $nMsg = $Btn[$x] Then
                    GUISetState(@SW_HIDE, $GUI[$i])
                    FileOpen(@ScriptDir&"\Sauvegardes\"&$list[$x+$i]) ; ### A changer selon le nom et l'emplacement du répertoire ###
                    ExitLoop 3
                Endif
            Next
        Endif
    Wend
Wend

Exit
    
Func Fin()
    Exit 0
EndFunc
Avatar du membre
sksbir
Niveau 7
Niveau 7
Messages : 384
Enregistré le : lun. 26 oct. 2009 17:57
Localisation : Lyon
Status : Hors ligne

Re: [R] Récupérer des noms de fichiers

#13

Message par sksbir »

Bonjour

Peut-etre qu'il marche ce script, mais quand je vois GUICtrlCreateButton dans une boucle, j'ai les poils qui se hérissent....

edit : en fait, la 1ere boucle "while 1" ne sert à rien , puisqu'il y a une 2eme boucle "while 1" à l'intérieur...
Avatar du membre
zeshrek
Niveau 10
Niveau 10
Messages : 984
Enregistré le : mer. 17 nov. 2010 09:31
Localisation : Sur ma chaise
Status : Hors ligne

Re: [R] Récupérer des noms de fichiers

#14

Message par zeshrek »

sksbir a écrit :Peut-etre qu'il marche ce script, mais quand je vois GUICtrlCreateButton dans une boucle, j'ai les poils qui se hérissent....
Comme c'est une solution que j'utilise aussi, pourrais tu nous donner les raisons de cette érrection capilaire ?
Moi quand je vois $Btn[$x] = GUICtrlCreateButton... je me dis que tout est bon dans la mesure ou les ID des boutons sont stockés dans un tableau, et pas tous dans la même variable. On peut donc les comparer au résultat d'un GUIGetMsg pour savoir si l'utilisateur a cliqué.
sksbir a écrit :edit : en fait, la 1ere boucle "while 1" ne sert à rien , puisqu'il y a une 2eme boucle "while 1" à l'intérieur...
La par contre je suis tout a fait d'accord avec toi.
Si vis pacem para bellum
Dixit
Niveau 2
Niveau 2
Messages : 17
Enregistré le : mer. 16 mars 2011 13:14
Status : Hors ligne

Re: [R] Récupérer des noms de fichiers

#15

Message par Dixit »

Oui c'est vrai elle ne sert à rien merci de le souligner. En fait ca m'aidait à résonner^^ C'est une boucle "d'attente d'action de l'utilisateur". On reste dedans tant que l'utilisateur ne fait rien. Si il y a clic, on retourne à la "phase de création".

Mais en y repensant peut-être qu'elle ne sert pas vraiment à rien, parce que le fait de créer les boutons tout le temps comme ca ce n'est pas trop gourmand en ressource machine? Parce que les boutons se superposent...
Répondre