Lister les fichiers d'un répertoire et de ses sous-répertoires dans un listbox

Soyez le premier à donner votre avis sur cette source.

Vue 8 529 fois - Téléchargée 1 397 fois


Description

voilà ce source est une réponse à un message posté sur le forum.....il est vrai que cela peut etre utile d'une façon ou d'un à beaucoup d'entre nous donc voilà le principe en utilisant la réccurcivité.....je me doute que ce type de source existe déjà mais bon...si quelqu'un ne l'a pas trouvé, pourquoi ne pas le reposter....et puis plus on a d'exemples plus on a de choix LOL

Source / Exemple :


'utilisation des API FindFirstFile , FindNextFile etc........en récurcif.....

'--------------------------------------------------------
'---La fonction Rechercher : ---
'--- Cette fonction recherche tous les fichiers dans ---
'--- le répertoire spécifié et ses sous-repertoires ---
'--- Elle retourne le nombre d'occurences trouvées ---
'--------------------------------------------------------
Public Function Rechercher(Chemin As String, FichierR As String, ResultatRecherche As ListeFichier) As Long

    '---Déclaration des variables---
    Dim lpFindFileData As WIN32_FIND_DATA
    Dim hFindFile As Long
    Dim lgRep As Long
    Dim CheminRep As String
    
    '---Recherche tous les fichiers demandés dans le répertoire Chemin---
    lpFindFileData.dwFileAttributes = &H10
    
    Dim FicTmp As String
    '---récupération du premier fichier du répertoire
    hFindFile = FindFirstFile(Chemin & FichierR, lpFindFileData)
    
    If hFindFile <> INVALID_HANDLE_VALUE Then
        Do
            '---on récupère le nom du fichier
            FicTmp = Mid$(lpFindFileData.cFileName, 1, InStr(lpFindFileData.cFileName, Chr$(0)) - 1)
            
            If FicTmp <> ".." And FicTmp <> "." And (lpFindFileData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = 0 Then
                '---si on tombe sur un fichier , on mémorise le nom du du fichier dans un tableau
                '---ainsi que le répertoire ou il se situe
                ResultatRecherche.Nombre = ResultatRecherche.Nombre + 1 '---un fichier ajouté
                ReDim Preserve ResultatRecherche.Chemin(1 To ResultatRecherche.Nombre)
                ReDim Preserve ResultatRecherche.Fichiers(1 To ResultatRecherche.Nombre)
                ResultatRecherche.Chemin(ResultatRecherche.Nombre) = Chemin '---chemin du fichier
                ResultatRecherche.Fichiers(ResultatRecherche.Nombre) = lpFindFileData '---nom du fichier
                ' Initialise lpFindFileData (Variable texte uniquement)
                lpFindFileData.cAlternate = String$(14, 0) '---on remet à blanc
                lpFindFileData.cFileName = String$(MAX_PATH, 0) '---on remet à blanc
            End If
        Loop Until FindNextFile(hFindFile, lpFindFileData) = 0 'on récupère le prochain fichier
    End If
    '---on arrète de scrutter le répertoire en court
    FindClose hFindFile
    
    '---Recherche dans les sous-répertoires---
    
    hFindFile = FindFirstFile(Chemin & "*.*", lpFindFileData)
    If (hFindFile <> INVALID_HANDLE_VALUE) Then
        Do
            '---on cherche un sous-répertoire
            If (lpFindFileData.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) = FILE_ATTRIBUTE_DIRECTORY Then
                '---un sous-répertoire a été trouvé
                '---on récupère le nom du sous répertoire
                CheminRep = Mid$(lpFindFileData.cFileName, 1, InStr(1, lpFindFileData.cFileName, Chr$(0)) - 1)
                '---attention il ne faut pas prendre en compte les valeurs "." et ".."
                '---considérées comme des répertoires mais qui ne nous intéressent pas
                If (CheminRep <> ".") And (CheminRep <> "..") Then
                    CheminRep = Chemin & CheminRep & "\"
                    '---on relance la fonction Rechercher pour récupérer les fichiers du sous répertoire
                    '---voici la récurcivité!!!!
                    '---on va alors récupérer tous les fichiers du sous répertoire mais on va alors rechercher
                    '---si dans ce sous répertoire il y a d'autres sous répertoires etc...
                    Rechercher = Rechercher(CheminRep, FichierR, ResultatRecherche)
                    'on récupère la main après avoir vérifier le contenu du sous répertoire
                End If
            End If
            '---et on continue pour tester un éventuel autre sous-répertoire
        Loop Until FindNextFile(hFindFile, lpFindFileData) = 0
    End If
    '---voilà on a vérifier tous les sous-répertoires
    FindClose hFindFile
    
    '---on retourne le nombre de fichiers trouvées
    Rechercher = ResultatRecherche.Nombre
End Function

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
2
Date d'inscription
mardi 28 décembre 2004
Statut
Membre
Dernière intervention
18 août 2006

Bonjour,

Pour ma part, je dirais que cette source m'a bien servie et qu'elle me parait suffisament commentée.
(en effet plus dans les API sont également commenter dans la source à Downloader)
... en tout cas suffisemment pour le débutant que je suis (
... alors que peut être pas assez pour le pro que semble être KALOBIT dans son profil
(KALOBIT, c'est rigolo tout ce que tu balance qd on voit que tu écris en parlant de la seule source que tu as laissé)
"Mon code est très peu commenté car je n'utilise que des méthodes basiques. Si toutefois ça vous dérange, je ferais un petit effort."

A part ça, pour ma part, j'ajouterai 2 petites amélioration :
- Dans la déclaration, il n'est pas besoin de "tailler" Chemin() avec la taille MAX_PATH, car cela impose après un Rtrim
- j'ai donc mis simplement "Chemin() As String " en ligne 47 du module
- et ajouter un RTrim dans la ligne suivante : "ResultatRecherche.Chemin(ResultatRecherche.Nombre) = RTrim(Chemin) '---chemin du fichier"
(la même modif ne peut être fait sur le "cFileName" car la variable est définie par l'API, il faudra donc nétoyer le résultat du nom de fichier après)

- les 2 Redim preserve à chaque nouvel enregistrement des 2 tableaux (ResultatRecherche.Chemin et ResultatRecherche.Fichiers) sont très couteux en temps.
(en effet, il faut par exemple 12sec sur ma machine pour parser des ssRepert qui comprennent 12000 fichiers contre 3 sec après modifs)
Voici les modifs que j'ai faites : (le principe est de dimensioner le tableau correctement une première fois et de l'agrandir si une erreur indique qu'il est trop petit) :
- ajout en début de fonction d'une constante pour gérer de combien agrandir les tableaux qd nécéssaire et ajouter un "On error ..."
Const icIncrementRedim As Integer = 1000
On Error GoTo GestErr
- ajout en fin de la fonction du gestionnaire d'erreur (il pourrait être paufiner, c un exemple)
sortie:
Exit Function
GestErr:
Select Case Err.Number
Case 9
If ResultatRecherche.Nombre < 2 Then
ReDim Preserve ResultatRecherche.Chemin(1 To icIncrementRedim)
ReDim Preserve ResultatRecherche.Fichiers(1 To icIncrementRedim)
Else
ReDim Preserve ResultatRecherche.Chemin(1 To UBound(ResultatRecherche.Chemin) + icIncrementRedim)
ReDim Preserve ResultatRecherche.Fichiers(1 To UBound(ResultatRecherche.Fichiers) + icIncrementRedim)
End If
Resume
Case Else
MsgBox Err.Description
Resume sortie
End Select
Messages postés
6
Date d'inscription
dimanche 4 juillet 2004
Statut
Membre
Dernière intervention
18 novembre 2004

Je viens de parcourir ce post en diagonale et je vois plein de choses qui font frêmir...
Je ne comprends pas pourquoi vous critiquez l'initiative de qqun qui poste une réponse à qqun d'autre.

Peut être que ce code n'est pas le sien, et alors ? Il aurait pu peut être mettre le lien vers le site ou il a trouvé l'info. Mais qui nous dit que ce site est le premier à avoir mis le code en route ? Alors il faut aller chercher dans les sources du site et poste le lien originel... etc etc. Au lieu de trouver une réponse rapide, on est parti dans les méandres d'internet.
Le but d'une recherche de code sur le net est de tomber rapidement sur un bout de code, une fonction, une piste qui permet de dépaner et fait souvent gagner d'innombrables heures de recherches et ou de programmation.
Si vous avez peur qu'on vous "fauche" votre code, ne le mettez pas sur le net, mais permettez moi de douter que dans des cas comme celui-ci vous soyez les seuls à avoir trouvé cette solution...

En ce qui concerne la clareté du code, il est peut être brouillon pour certains, mais il a le mérite d'exister.
Il ne s'agit pas non plus ici de créer un beau code lisible documenté, avec error trap et tout le toutim qu'il suffit de copier et de placer dans son programme sans rien faire. Ce genre de comportement fera que dans le prochain programme on est condamné à faire la même chose et l'on apprend rien.
Cela n'empêche pas que plus le code sera lisible et documenté, plus il sera facile à utiliser.

La lecture de ce post permet d'apprendre une technique et des outils à utiliser. A partir de ce code, on pourra construire le sien, l'améliorer, le modifier à volonté pour lui donner la forme que l'on veut.
Enfin bon...
Finalement j'ai trouvé ce que je cherchais... En .net c'est beaucoup plus court pour faire la liste des fichiers d'un répertoire...
Messages postés
515
Date d'inscription
dimanche 17 février 2002
Statut
Membre
Dernière intervention
10 mars 2008
2
ok, j'ai juste mi la fonction pour info...j'ai mis ce source en 5 minutes vu ke je l'avais extrait d'un code qui trainait sur mon PC...kelk'un cherchait une réponse je lui ai proposé cela ...maintenant désolé si je n'ai pa détaillé le type perso...je pensais que les commentaires étaient suffisant....le prochaine fois je mettrai toutes les déclarations comme ça il faudra juste faire un copier/coller ;-)

Je prendrai plus de temps pour les réponses aux forums....en même temps je me dis k'au moins lorske la personne a posé sa kestion sur le forum elle a eut une réponse rapide....

@+

PS:
J'ai rien contre ta remark mais j'ai trouvé un peu fort ke tu me diz ke mon code posté par kelk'1 d'autre était 100 fois plus intéressant ke mon propre code en sachant ke les infos k'il a trouvé semble bien etre du copier/coller de la MSDN...

re-PS:
sans rancune ;-)))
Messages postés
169
Date d'inscription
mardi 15 juillet 2003
Statut
Membre
Dernière intervention
7 avril 2008
2
avoue au moins que le sien est mieux documenté.

j'ai pas eu à télécharger quoi que ce soit pour m'en faire un code perso

Et le commentaire qui reviens le plus souvent sur les posts c'est que les variables ne sont pas définies ou décrites. Et voilà, comme d'hab.

Un post pour les débutants doit être très clairement documenté.
Surtout que vu le nombre de résultat qu'il y a quand tu fais une recherche sur le site, si tu dois DL tous les zip pour être sur d'avoir tout ce qu'il te faut, je te souhaite bien du courage.

La moindre des choses, c'est une déclaration claire, c'est la base du code alors pourquoi la négilger.
Ce qui m'a surtout géné c'est ton type perso. pas une info.
Voilà, je critique pas le fait que la source soit déjà dispo, c'est juste que tu balance un bout de code comme ça Qui n'est absolument pas explicite.
Messages postés
515
Date d'inscription
dimanche 17 février 2002
Statut
Membre
Dernière intervention
10 mars 2008
2
tu te fiche de moi kalobit .......non sérieux????j'ai dit ke ce source devait exister......mais me balancer que tu as trouvé un meilleur code en me filant mon propre code!!!!!! et oui compare les dates et les commentaires !!!!!!
************************************************
mon source :
Date d'ajout :05/03/2004
extrait du commentaire:
'--------------------------------------------------------
'---La fonction Rechercher : ---
'--- Cette fonction recherche tous les fichiers dans ---
'--- le répertoire spécifié et ses sous-repertoires ---
'--- Elle retourne le nombre d'occurences trouvées ---
'--------------------------------------------------------
************************************************

le post dont tu parles:
Posté par : jojo93 le 29/05/2004 20:55:54
extrait du source dont il parle:
'--------------------------------------------------------
'---La fonction Rechercher : ---
'--- Cette fonction recherche tous les fichiers dans ---
'--- le répertoire spécifié et ses sous-repertoires ---
'--- Elle retourne le nombre d'occurences trouvées ---
'--------------------------------------------------------

CELA RESSEMBLE FORTEMENT A MON CODE TU TROUVES PAS!!!!!!!!!

mais alors comment Jojo93 a fait pour avoir toutes ces déclarations d'API , de constantes etc..........EURECA il a surement du télécharger le fichier ZIP!!!!!!!!!

PS:merci encore pour ton commentaire et surement aussi pour la note qui doit allée avec!!!!!!!!!
Afficher les 11 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.