Routine dir récursive pour obtenir la liste de tous les fichiers dans un répertoire et ses sous-dossiers avec la taille en o

Contenu du snippet

Utilise la structure TypeFichier (nom, repertoire, taille)
Stockage de cette liste dans un tableau global : ListeFichiers()

dans la sub "liste_fichiers",
modifier le nom du Dossier à lister stocké dans la variable: Dossier

Routine récursive : Dir_Fichiers
Attention : la fonction VB "Dir" n'est pas récursive, on doit donc repositionner un pointeur sur la dernière entrée lue par la fonction "Dir" avant de poursuivre la lecture des entrées.

Source / Exemple :


Option Explicit  'déclaration obligatoire des variables

Public Type TypeFichier
    nom As String
    repertoire As String
    taille As Long
End Type

Public ListeFichiers() As TypeFichier
'

Public Sub liste_fichiers()
    
    Dim Dossier As String
    Dim NbreFicTot As Long
    
    Debug.Print String(100, "*")
    
    ReDim ListeFichiers(0 To 0) As TypeFichier
    
    Dossier = "D:\transfert"
    
    Call Dir_Fichiers(Dossier)
        
    NbreFicTot = UBound(ListeFichiers)
    MsgBox NbreFicTot & " fichiers", vbInformation, "Fin Liste Fichiers"
    
End Sub

Public Sub Dir_Fichiers(ByVal Dossier As String)
    
    'utilise la Variable globale : 'ListeFichiers() as TypeFichier
    
    Dim Chemin As String
    Dim FichierLu As String
    Dim NbreFichiersLus As Long, NbreFichiers As Long
    Dim i As Long
    
    NbreFichiersLus = 0
    Chemin = Dossier + "\"
    'liste les fichiers et les dossiers avec l'option vbDirectory
    FichierLu = Dir(Chemin, vbDirectory)
    Do While FichierLu <> ""
        NbreFichiersLus = NbreFichiersLus + 1
        If FichierLu <> "." And FichierLu <> ".." Then
            If (GetAttr(Chemin & FichierLu) And vbDirectory) = vbDirectory Then
                'c'est un répertoire, on l'examine de facon récursive
                Debug.Print "Dossier: " & Chemin & FichierLu & "  " & String(70, "-")
                Call Dir_Fichiers(Chemin & FichierLu)
                Debug.Print "Fin Dossier: " & Chemin & FichierLu & "  " & String(70, "-")
                'après avoir examiné le sous-dossier, il faut repositionner Dir sur l'entrée suivante
                'car la fonction dir n'est pas récursive et a donc perdue la dernière position
                'on réinitialise donc Dir et repositionne le flag à la bonne place avec NbreFichiersLus
                FichierLu = Dir(Chemin, vbDirectory)
                For i = 1 To NbreFichiersLus - 1
                    FichierLu = Dir
                Next i
            Else
                'c'est un fichier, on le met dans la liste globale
                'augmente de 1 la taille de la liste en préservant le contenu du tableau de la liste
                Debug.Print FichierLu
                NbreFichiers = UBound(ListeFichiers) + 1
                ReDim Preserve ListeFichiers(0 To NbreFichiers) As TypeFichier
                'ajoute le fichier à la liste
                ListeFichiers(NbreFichiers).nom = FichierLu
                ListeFichiers(NbreFichiers).repertoire = Chemin
                ListeFichiers(NbreFichiers).taille = FileLen(Chemin & FichierLu)
            End If
        End If
        'passe à l'entrée suivante de la fonction Dir
        FichierLu = Dir
    Loop
    
End Sub

Conclusion :


Toutes les étapes sont affichées en mode debug à l'exécution.
Attention les fichiers ne sont pas triés, même entre les répertoire car la fonction Dir ne trie pas les fichiers.
Utiliser ensuite le tableau pour faire vos traitement de tri par dossier etc...

A voir également

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.