Page 1 sur 1
[R] Récupérer des noms de fichiers
Posté : mer. 16 mars 2011 13:43
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
; Shows the filenames of all files in the current directory.
$search = FileFindFirstFile(@ScriptDir&"\Omega")
; Check if the search was successful
If $search = -1 Then
MsgBox(0, "Error", "No files/directories matched the search pattern")
Exit
EndIf
While 1
$file = FileFindNextFile($search)
If @error Then ExitLoop
MsgBox(4096, "File:", $file)
WEnd
; Close the search handle
FileClose($search)
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.
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 15:35
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)
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 15:59
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
Code : Tout sélectionner
#include <Array.au3>
#include <File.au3>
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$search = _FolderExplorer(@ScriptDir & "\Omega", "*.*", 1)
Dim $Button[$search[0]]
$Form1 = GUICreate("Form1", 800, 600)
$step = 5
For $i = 1 To $search[0] Step $step
For $j = 1 To $step
If ($i + $j < $search[0] + 2) And ($i + $j > 1) Then
$btntxt1 = StringSplit($search[$i + $j - 1], "\")
$btntxt2 = StringSplit($btntxt1[$btntxt1[0]], ".")
$Button[$i + $j - 2] = GUICtrlCreateButton($btntxt2[1], (($i / $step) * 88) + 5, (($j - 1) * 30) + 5, 83, 25, $WS_GROUP)
EndIf
Next
Next
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
EndSwitch
For $i = 0 To $search[0] - 1
If $nMsg = $Button[$i] Then
MsgBox(0, "", "vous avez apuyé le boutton suivant :" & @CRLF _
& "ID boutton : " & $Button[$i] & @CRLF _
& "N° boutton : " & $i & @CRLF _
& "Label Boutton : " & GUICtrlRead($Button[$i]) & @CRLF _
& "Chemin du fichier : " & $search[$i + 1])
EndIf
Next
WEnd
Func _FolderExplorer($Racine, $Filtre = "*.*", $FileOrDir = "0", $FullPath = True, $Recursif = True)
;~ $Racine : Racine à explorer
;~ $Filtre : [optionnel] Masque de filtrage des fichiers (n'impacte pas le nom des sous répertoires ou la recherche se fera)
;~ Par défaut le masque est *.*
;~ $FileOrDir : [Optionnel] Indique si la fonction doit renvoyer des fichiers et/ou les deux
;~ $FileOrDir=0 (défaut) Fichiers & dossiers
;~ $FileOrDir=1 Fichiers seulement
;~ $FileOrDir=2 Répertoires seulement
;~ $FullPath : [Optionnel] Indique si la fonction renvoie le chemin complet ou le chemin relatif
;~ $FullPath = 0/false renvoie le chemin relatif à $Racine
;~ $FullPath = 1/true (defaut) renvoie le chemin complet
;~ $Recursif : Explore ou non les sous répertoires
;~ $Recursif = 0/false n'explore que le répertoire $Racine
;~ $Recursif = 1/true (défaut) explore toute la sous arborescence
Local $ListeFichiers, $CptrFichier
If $Filtre = -1 Then $Filtre = "*.*"
If $FileOrDir = Default Or $FileOrDir = -1 Then $FileOrDir = 0 ; convertit les options "par défaut" standard en true
If $Recursif = Default Or $Recursif = -1 Then $Recursif = True ; convertit les options "par défaut" standard en true
If $FullPath = Default Or $FullPath = -1 Then $FullPath = True ; convertit les options "par défaut" standard en true
$ListeFichiers = FolderParser($Racine, $Filtre, $FileOrDir, $Recursif) ; on parse le dossier
If $FullPath <> True Then ; si le retour doit etre relatif
_ArrayTrim($ListeFichiers, StringLen($Racine & "\"), 0, 1) ; on coupe le début des lignes
EndIf
$CptrFichier = UBound($ListeFichiers) - 1 ; on met a jour le compteur avec le nombre de lignes dans le tableau
$ListeFichiers[0] = $CptrFichier
Return $ListeFichiers ; et on sort
EndFunc ;==>_FolderExplorer
Func FolderParser($Racine, $Filtre = "*.*", $FileOrDir = "0", $Recursif = True)
Local $TabFichier, $i, $Chemin, $SubFolderFileList
Local $CptrFichier = 0
Dim $FullFileList[1] = [0]
$TabFichier = _FileListToArray($Racine, $Filtre, $FileOrDir)
If Not @error Then
For $i = 1 To $TabFichier[0]
$Chemin = $Racine & "\" & $TabFichier[$i] ; recupere le chemin du fichier
If not (StringInStr(FileGetAttrib($Chemin), "D") And $Recursif = True) Then ; trouvé fichier correspondant au filtre
$CptrFichier = $CptrFichier + 1 ; incrementation du compteur
ReDim $FullFileList[$CptrFichier + 1] ; redimensionnement du tableau de liste
$FullFileList[0] = $CptrFichier ; mise a jour du compteur dans le tableau
$FullFileList[$CptrFichier] = $Chemin ; ajout de la ligne
EndIf
If StringInStr(FileGetAttrib($Chemin), "D") And $FileOrDir <> 1 Then ; trouvé répertoire correspondant au filtre
$CptrFichier = $CptrFichier + 1 ; incrementation du compteur
ReDim $FullFileList[$CptrFichier + 1] ; redimensionnement du tableau de liste
$FullFileList[0] = $CptrFichier ; mise a jour du compteur dans le tableau
$FullFileList[$CptrFichier] = $Chemin ; ajout de la ligne
EndIf
Next
EndIf
If $Recursif = True Then ; récursif ?
$TabFichier = _FileListToArray($Racine)
If Not @error Then
For $i = 1 To $TabFichier[0]
$Chemin = $Racine & "\" & $TabFichier[$i] ; recupere le chemin
If StringInStr(FileGetAttrib($Chemin), "D") Then ; c'est un répertoire
$SubFolderFileList = FolderParser($Chemin, $Filtre, $FileOrDir, $Recursif) ; explorer le sous repertoire par appel recursif de la fonction
_ArrayDelete($SubFolderFileList, 0) ; on suprimer l'enregistrement zero (nb de lignes )
_ArrayConcatenate($FullFileList, $SubFolderFileList) ; et on concatene dans le tableau de liste
$CptrFichier = UBound($FullFileList) - 1 ; et on compte combien on a maintenant de fichiers dans la liste
EndIf
Next
EndIf
EndIf
Return $FullFileList ; on renvoie le tableaui
EndFunc ;==>FolderParser
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 16:12
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.
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 16:20
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
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 16:38
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 !
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 16:48
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?
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 17:16
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.
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 19:10
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
#include<Array.au3>
#include"RecFileListToArray.au3"
Dim $list[100]
$list= _RecFileListToArray ( @ScriptDir&"\Sauvegardes", "*.txt",1,2,1,"")
_ArrayDisplay($list, "Liste fichier")
MsgBox(0,"Liste",""&$list&"")
MsgBox(0,"Liste",""&$list[0]&"")
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.
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 19:36
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)
Re: [..] Récupérer des noms de fichier
Posté : mer. 16 mars 2011 23:04
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.
Re: [R] Récupérer des noms de fichiers
Posté : jeu. 17 mars 2011 19:24
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
Re: [R] Récupérer des noms de fichiers
Posté : ven. 18 mars 2011 09:34
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...
Re: [R] Récupérer des noms de fichiers
Posté : ven. 18 mars 2011 10:07
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.
Re: [R] Récupérer des noms de fichiers
Posté : ven. 18 mars 2011 11:12
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...