[..] Lister dossier puis fichier

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
jcaspar
Niveau 7
Niveau 7
Messages : 449
Enregistré le : mar. 23 sept. 2008 17:58
Status : Hors ligne

[..] Lister dossier puis fichier

#1

Message par jcaspar »

B :D onjour à tous !

Je souhaiterais lister dossiers et les fichiers présents dans chaque dossier..
Le code ci dessous permet de lister les fichiers ou dossier ... Pourriez vous svp
m'expliquer comment faire pour lister les dossiers puis les fichiers...

Je pense qu'il faudrait utiliser une boucle for imbriquée ....
for (i=0; to 100; i++){
for (j=0; to 100; j++)
}

Mais comment indiquer à Autoit qu'il s'agit d'un fichier ou d'un dossier ?

Je vous remercie d'avance pour vos conseils :mrgreen: ...


Code : Tout sélectionner


#include <File.au3>
#include <Array.au3>

local $FileList = _FileListToArray("T:\Dossier")
local $sFile="test.txt"

If @error = 1 Then
    MsgBox(0, "", "Pas de dossier trouvé.")
    Exit
EndIf
If @error = 4 Then
    MsgBox(0, "", "Aucun fichier trouvé.")
    Exit
EndIf

_ArrayDisplay($FileList, "$FileList")
_FileWriteFromArray($sFile, $FileList, 1)


 
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#2

Message par lesolutionneur »

Je n'ai pas trop le temps de répondre au reste mais voici un élément de réponse pour ceci:
Mais comment indiquer à Autoit qu'il s'agit d'un fichier ou d'un dossier ?

Code : Tout sélectionner

$sPath = "C:\dossier\"
Local $szDrive, $szDir, $szFName, $szExt
_PathSplit($sPath, $szDrive, $szDir, $szFName, $szExt)

If $szFName = "" AND $szExt= "" Then
   ;On a un dossier
Else
   ;On a un fichier
EndIf
 

Sinon, on peut faire autrement mais c'est pas du code très propre:

Code : Tout sélectionner

#include <Array.au3>
#include <File.au3>

Func _FileInFolderListToArray2D($sPath)
  $aFolder = _FileListToArray($sPath, "*", 2) ;On ne retourne que les dossiers
  Dim $aFile[$aFolder[0]+1] ;On crée un tableau ayant la bonne taille
  
  For $i=1 To $aFolder[0]
   $aFile[$i] = _FileListToArray($sPath & $aFolder[$i], "*", 1) ;On retourne les fichiers
  Next

  _ArrayConcatenate($aFolder, $aFile)

 Return $aFolder
EndFunc
 
Comme ça, tu as un dossier par ligne, colonne 1 de $aFolder (la première ligne contenant le nombre de dossiers)
Et 1 array à la colonne 2 par ligne. (la deuxième ligne contenant le nombre de fichiers)

Tu peux l'utiliser comme ça:

Code : Tout sélectionner

#include <Array.au3>
#include <File.au3>

$aFolder = _FileInFolderListToArray2D("C:\dossier\")

_ArrayDisplay($aFolder[1][1]) ;Affiche les fichiers présents dans le dossier de chemin relatif $aFolder[1][0]

 
Bonne chance :)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#3

Message par mikell »

Tu peux aussi utiliser une des nombreuses variantes récursives de _FileListToArray, quitte à rajouter un peu de code
http://www.autoitscript.fr/forum/viewto ... f=21&t=479
► Afficher le texte
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#4

Message par jguinch »

@Mikell
StringRegExpReplace($sPath, '\\', "\\\\")), $sSDirF[3] = [0, StringReplace($sSDirFTMP, "*", ""), "(?i)(" & StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace(StringRegExpReplace("|" & $sSDirFTMP & "|", '\|\h*\|[\|\h]*', "\|"), '[\^\$\(\)\+\[\]\{\}\,\.\=]', "\\$0"), "\|([^\*])", "\|^$1"), "([^\*])\|", "$1\$\|"), '\*', ".*"), '^\||\|$', "") & ")"]
Ca pique les yeux là !! :shock:
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#5

Message par mikell »

Je suis absolument d'accord :mrgreen:
Mais là c'est pas moi, c'est le code original de la fonction _FileListToArrayEx ^^
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
lesolutionneur
Niveau 7
Niveau 7
Messages : 368
Enregistré le : ven. 09 déc. 2011 11:25
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#6

Message par lesolutionneur »

Euh attends, ton code est encore plus sale que le mien ! :P
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#7

Message par GaRydelaMer »

Bonsoir

plus propre utilise un objet : "Scripting.FileSystemObject"

Code : Tout sélectionner

#include <Array.au3>

Local $Path = @ScriptDir
Local $oFSO = ObjCreate("Scripting.FileSystemObject"), $sTemp, $Array

If $oFSO.FolderExists($Path) Then
    Local $oFolder = $oFSO.GetFolder($Path)
    ; Lister les sous-dossiers
    For $oSubFolder In $oFolder.SubFolders
        $sTemp &= $oSubFolder.Name & "\|" 
    Next
    ; Lister les fichiers
    For $oFile In $oFolder.Files
        $sTemp &= $oFile.Name & "|"
    Next
EndIf
$oFSO = 0
$Array = StringSplit(StringTrimRight($sTemp, 1), "|")

_ArrayDisplay($Array)
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#8

Message par mikell »

Sympa le FileSystemObject mais je crois que tu as oublié le principe de son script :mrgreen:
jcaspar a écrit :Je souhaiterais lister dossiers et les fichiers présents dans chaque dossier..
En l'état ton script retourne le même résultat qu'un _FileListToArray avec flag 0
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#9

Message par GaRydelaMer »

Oupss pas vu non plus, mais c'est pareil, moi j'ai nue fonction qui contient ce code en reccursif.

C’était d’ailleurs une discutions pour FileListeToArrayEx() qu'elle solution adopter pour choisir la plus rapide.

Dans SON cas j'utilise effectivement une variante de la fonction que tu as mentionné: _RecFileListToArray() de Melba23.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#10

Message par mikell »

Bah tu sais, moi bête et discipliné j'écoute ceux qui savent
Image1.jpg
Mais j'aimerais bien voir ta fonction récursive à base de FileSystemObject
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#11

Message par GaRydelaMer »

Bonjour

je me suis amusé à faire une fonction récursive, en fait y'a 2 versions, une avec un tableau classique en 2D l'autre avec un recordset.

J'ai fait la version RecordSet, pour trier facilement le résultat, les dossier en 1er et les noms de fichier classé aussi.

Bien sur on peut après imaginer ajouter un pattern pour afficher que les dossier et/ou les fichiers qu'on veux, limiter la récursion c'est à dire la profondeur des sous dossier etc..

L'autre avantage de la version RecordSet c'est que l'on pourra facilement Filtrer les résultats après
$oRs.Filter = "Type = 'File' And Name Like '*.au3*'" par exemple

Coté performance, je viens de tester la version RecordSet et 3 fois plus rapide sur un dossier qui contient: 9 365 Fichier, 891 Dossiers
Sans le trie
Version RecordSet (10256 rows) en ms: 7522.32655709834
Version Array (10256 rows) en ms: 20128.9287917255

Avec le trie
Version RecordSet (10256 rows) en ms: 7964.32368746228
Version Array (10256 rows) en ms: 21278.4703115633


Le résultat final tu peux avoir un tableau 2d avec (Type = Folder ou File):
0|Type|Name|Path complet
n|
► Afficher le texte
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#12

Message par mikell »

Merci
La version 2 va bien mais la version 1 me renvoie une erreur :
Line 56 :
$oRs.AddNew($aNames, $aValue)^ ERROR
Error: The requested action with this object has failed.
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#13

Message par GaRydelaMer »

Ça marche nickel chez moi et au taf.

Les 2 pc sont sous Win7, parcours d'un dossier sur un disque D:


Tu as chois quel dossier de départ ?, je suis en train de tester j'ai des soucis si on met c:\ avec les dossier spéciaux style $Recycle.bin, Document & Settings

Je cherche à contourner le problème.
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#14

Message par mikell »

XP SP3 32bits, dossier de départ : bureau (@desktopdir)
Donc effectivement ya du Document & Settings et plein de références à des dossiers spéciaux
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#15

Message par GaRydelaMer »

Voila la version que j'utilise depuis un moment déjà.

Super rapide et assez flexible. http://www.autoitscript.com/forum/topic ... -2-dec-12/

Prendre la version dans le zip, le forum US a une mauvaise tendance de supprimer les "\".
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11830
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#16

Message par Tlem »

Si les choses n'ont pas changées depuis la dernière fois que j'ai testé cette fonction, je tiens à rappeler qu'en cas d'utilisation récursive fichiers + dossiers, la totalité des dossiers 'scannés' est retourné avec le résultat de la recherche (ceci correspondant à une fonctionnalité voulue par Melba et non un bug quelconque).

Edit : Après contrôle, je confirme le renvoi du nom de tous les dossiers scannés en mode récursif fichiers + dossiers, même si ceux-ci ne correspondent pas au masque de recherche.

Ceci signifie que pour une recherche de fichiers et dossiers portant un certain nom, vous devez utiliser la fonction deux fois :
- 1 fois en recherche de fichiers
- 1 fois en recherche de dossiers. ^^
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é".
GaRydelaMer
Niveau 7
Niveau 7
Messages : 450
Enregistré le : mer. 18 mars 2009 22:12
Localisation : Montpellier
Status : Hors ligne

Re: [..] Lister dossier puis fichier

#17

Message par GaRydelaMer »

C'est exact, mais y a un moyen simple c'est d'ajouter le dernier "\" dans le chemin de départ de la recherche ainsi dans le tableau les dossier comporteront aussi le dernier "\"

$arr[n] = "c:\xxx\" on reconnaitra le dossier avec le dernier caractère If StringRight($arr[n], 1) = "\" Then on a un dossier
$arr[n] = " c:\xxx\xx.aa" ici un fichier


Pour plus d'info voir la doc de la fonction dans l'UDF
Répondre