begin process at 2012 05 27 18:24:18
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Fichier / Disque

 > ROUTINE DIR RÉCURSIVE POUR OBTENIR LA LISTE DE TOUS LES FICHIERS DANS UN RÉPERTOIRE ET SES SOUS-DOSSIERS AVEC LA TAILLE EN OCTETS

ROUTINE DIR RÉCURSIVE POUR OBTENIR LA LISTE DE TOUS LES FICHIERS DANS UN RÉPERTOIRE ET SES SOUS-DOSSIERS AVEC LA TAILLE EN OCTETS


 Information sur la source

 Description

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

  • 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
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...



 Sources de la même categorie

ECLATER UN CLASSEUR EXCEL EN AUTANT DE FICHIERS QUE DE FEUIL... par GMY
Source avec Zip Source avec une capture Source .NET (Dotnet) MAGIC FILE NAME : RENOMMEZ VOS FICHIERS AUTOMAGIQUEMENT ! par Erudix
Source avec Zip Source .NET (Dotnet) MODIFIER LES EXTENSION DES FICHIERS par okosa
Source avec Zip Source avec une capture FILE,SECURITY,FICHIER par okosa
Source avec Zip Source avec une capture Source .NET (Dotnet) PATCHEUR DE FICHIER par tototh

 Sources en rapport avec celle ci

Source avec Zip SUPPRESSION DE CERTAINS FICHIERS DANS UN RÉPERTOIRE PARTICUL... par noritakaroi2labaston
Source avec Zip LISTER VOS DROITS CONCERNANT LES REPERTOIRES DE VOTRE ORDINA... par BefaDuDesert
Source avec Zip Source .NET (Dotnet) CLASSE LISTE DE FICHIER RÉCURSIVE par elwingil
Source avec Zip Source avec une capture COMPARATEUR DE FICHIERS PARAMÉTRABLE par Floneva
Source avec Zip TRAITEMENT DES PHOTOS (PAR REPERTOIRE) par capricorne83

Commentaires et avis

Commentaire de jack le 01/12/2011 02:13:37 administrateur CS

Salut
La fonction Dir est lourde en temps d'exécution.
La méthode qui consiste à resynchroniser la fonction après avoir exploité d'autres répertoires va ralentir considérablement le programme dès qu'on s'attaque à des répertoires nombreux et chargés.
Sans vouloir me faire de pub, j'ai bossé sur le sujet il y a quelques années : http://www.vbfrance.com/codes/REMPLACER-DIR-CLASSE-DIR2-AVANTAGES_37859.aspx

Commentaire de Renfield le 01/12/2011 07:36:43 administrateur CS

l'API FindFirstFile et ses copines fonction aussi bien l'affaire...

et ca t'eviterais cette gymnastique avec le Dir
Je ne suis pas fan de ta seconde boucle :

'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

C'est une perte de temps...

Ta procédure, outre ces Debug.Print qui la rendent assez verbeuse... n'est pas facilement réutilisable dans un autre projet.
En effet, elle travaille avec un tableau prédéfinit...


Ton tableau possède une case vide en fin de tableau, pour quelle raison ?

Commentaire de JJDai le 01/12/2011 18:37:33

Bonjour
Ou l'utilisation de l'objet fileSystemObject de la bibliothèque vbrunscript.
JJDai

Commentaire de JJDai le 01/12/2011 18:53:20

Un petit exemple:

Option Explicit

Sub test()
    listerDossiers ("c:\")
End Sub

Sub listerDossiers(Optional sFolder As String = "")
Dim fso As FileSystemObject
Dim fld As Folder
Dim fldParent As Folder
    
    Set fso = New FileSystemObject
    Set fldParent = fso.GetFolder(sFolder)
    
    For Each fld In fldParent.SubFolders
        Debug.Print fld.Path & "-" & fld.Size
        Call listerDossiers(fld.Path)
        DoEvents
    Next
    
End Sub

Il faut bien sur référencer microsoft scripting runtime

JJDai

Commentaire de Renfield le 02/12/2011 08:51:59 administrateur CS

Non, JJDai, ce n'est pas une option !

fileSCRIPTINGobject  le bien nommé est a reserver au scripting
trop lent en dehors...

ca fonctionne, mais c'est lent et ajoutes une dépendance

Commentaire de lionyz le 05/12/2011 12:41:59

Un exemple qui utilise la fonction Scan

Permet de mettre tous les sous-dossiers d'un dossier dans une liste (ListDoss)
et tous les fichiers des sous-dossiers dans une autre liste (ListFich)
Il faut initialiser les 2 listes (ListView) et référencer microsoft scripting runtime


Dim Dossier As Folder, Sousdossier As Folder, Fichier As File
Dim fso As FileSystemObject

Private Sub Form_Load()

Scan_Dossier "c:\MonDossier"

End Sub

Sub Scan_Dossier(ByVal Dossier As Folder)

    On Error GoTo Erreur

    Dim PlusDossier as Boolean

    For Each Fichier In Dossier.Files
        If PlusDossier = False Then
         Set itmx = ListDoss.ListItems.Add(, , Dossier): PlusDossier = True
        End If
        Set itmy = ListFich.ListItems.Add(, , Fichier)
    Next

    PlusDossier = False
    For Each Sousdossier In Dossier.SubFolders
         Scan_Dossier Sousdossier
    Next
    
    Set itmx = Nothing
    Set itmy = Nothing
    
    Exit Sub

Erreur:
MsgBox Err.Number & vbCrLf & Err.Description
Err.Clear

End Sub

Commentaire de Baddante le 03/02/2012 09:32:53

L'API ok, perf. avantage.
Simplicité d'écriture  le code VB, mais limité à taille en octets sur 32 bits (limite VB6)
donc fichier(s) ou addition de fichiers dans un dossier inférieures à 2 go (environ)
Le FSO (filesystemObject) est simple à utiliser / coder par rapport à l'api et fonctionne avec
une property size sur 64 bits.

A noter qu'on ne peut ouvrir / gérer un fichier avec une syntaxe UNC (\\remotehost\share)
\fichier.txt) en DOT.NET l'utilisation UNC, par exemple pour créé un dossier fonctionne.



Commentaire de lionyz le 03/02/2012 22:31:06

Bonjour,

Il est vrai que la fonction Scan (exemple ci-dessus) pose problème
pour des fichiers en réseau (\\remotehost\share\fichier.txt)
Exemple: pour scanner un dossier en réseau de 200 fichiers il faut plus de 10 mn alors que pour
         le même dossier en local il ne faut que quelques secondes

Même si le temps d'accès à un fichier en réseau est plus long que pour un fichier
en local, je ne comprends pas pourquoi dans ce cas le scan est aussi lent.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

Récupérer la liste des fichiers .gif dans un répertoire [ par hub ] Salut à tous,Comment récupérer la liste des fichiers d'un répertoire (en les filtrant).En effet, je souhaiterais récupérer dans un tableau tous les no Fichiers en PDF [ par zebre ] je voudrai mettre dans un répertoire la liste des fichiers que je récupère au format pdf.je vous explique:je récupère la liste des fichiers contenus d Récuperer la liste des fichiers d'un répertoire internet [ par oxboz ] Salut ... Je suis d&#233;butant en C# ,(2 semaines de pratique) et j'aimerai r&#233;cup&#233;rer la liste des fichiers d'un r&#233;pertoire sur le net Dresser la liste des links dans les fichiers d'un répertoire [ par DPhBxl ] &nbsp;Ce message est d&#233;j&#224; post&#233; dans la cat&#233;gorie [FICHIER/DISQUE], mais j'ai besoin d'une aide urgente. Pouvez-vous m'aide au pro Liste de fichiers et sous-répertoire dans feuille Excel [ par jr10 ] Bonjour, Pour faire cette liste, Je dois plutôt utiliser - DIR - Ou FileSearch et compagnie Merci de tout coup de main car j'ai du mal à démarre Liste de fichiers et sous-répertoire dans feuille Excel [ par jr10 ] Bonjour, Pour faire cette liste, Je dois plutôt utiliser - DIR - Ou FileSearch et compagnie Merci de tout coup de main car j'ai du mal à démarre Faire une recherche d'une liste de valeurs (noms de fichiers) sur le disque dur et copier les fichiers dans un répertoire si trouvé [ par cocoboss25 ] Bonjour, je ne suis pas certain de poster dans la bonne section mais je tente quand meme le coup. Je cherche un code qui me permettrait de verifier l Probleme utilisation de la fonction Dir() [ par Chiche69 ] Bonjour a tous: Voici mon problème: en fait je réalise un petit programme pour réaliser un Blind test. Donc je commence a sélectionner un dossier con [.NET] Copier des fichiers si le répertoire existe [ par dodineau ] Bonjour, je voudrais copier tous les fichiers d'un répertoire qui porte un nom spécifique. J'essaie d'expliquer clairement ce que je veux : Voici mon [Déplacé .Net --> VBS] [VBS] supprimer une liste de fichiers. [ par zatox ] Bonjour à tous, j'ai créé un script qui recherche certains fichiers sur l'ordinateur, et les liste dans un raport au format .txt les chemins complets


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales