Page 1 sur 1

[..] Lister dossier puis fichier

Posté : jeu. 14 mars 2013 11:09
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)


 

Re: [..] Lister dossier puis fichier

Posté : jeu. 14 mars 2013 12:52
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 :)

Re: [..] Lister dossier puis fichier

Posté : jeu. 14 mars 2013 14:33
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

Re: [..] Lister dossier puis fichier

Posté : jeu. 14 mars 2013 14:55
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:

Re: [..] Lister dossier puis fichier

Posté : jeu. 14 mars 2013 15:12
par mikell
Je suis absolument d'accord :mrgreen:
Mais là c'est pas moi, c'est le code original de la fonction _FileListToArrayEx ^^

Re: [..] Lister dossier puis fichier

Posté : jeu. 14 mars 2013 19:07
par lesolutionneur
Euh attends, ton code est encore plus sale que le mien ! :P

Re: [..] Lister dossier puis fichier

Posté : dim. 17 mars 2013 10:31
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)

Re: [..] Lister dossier puis fichier

Posté : dim. 17 mars 2013 11:04
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

Re: [..] Lister dossier puis fichier

Posté : dim. 17 mars 2013 14:57
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.

Re: [..] Lister dossier puis fichier

Posté : dim. 17 mars 2013 17:56
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

Re: [..] Lister dossier puis fichier

Posté : lun. 18 mars 2013 04:24
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

Re: [..] Lister dossier puis fichier

Posté : lun. 18 mars 2013 11:24
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.

Re: [..] Lister dossier puis fichier

Posté : lun. 18 mars 2013 12:36
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.

Re: [..] Lister dossier puis fichier

Posté : lun. 18 mars 2013 13:51
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

Re: [..] Lister dossier puis fichier

Posté : mar. 19 mars 2013 13:55
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 "\".

Re: [..] Lister dossier puis fichier

Posté : mar. 19 mars 2013 16:17
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. ^^

Re: [..] Lister dossier puis fichier

Posté : mar. 19 mars 2013 16:21
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