ROUTINE DIR RÉCURSIVE POUR OBTENIR LA LISTE DE TOUS LES FICHIERS DANS UN RÉPERTO

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 - 1 déc. 2011 à 02:13
lionyz Messages postés 62 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 30 octobre 2012 - 3 févr. 2012 à 22:31
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/53805-routine-dir-recursive-pour-obtenir-la-liste-de-tous-les-fichiers-dans-un-repertoire-et-ses-sous-dossiers-avec-la-taille-en-octets

lionyz Messages postés 62 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 30 octobre 2012
3 févr. 2012 à 22:31
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.
Baddante Messages postés 33 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 24 février 2008
3 févr. 2012 à 09:32
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.
lionyz Messages postés 62 Date d'inscription samedi 10 janvier 2009 Statut Membre Dernière intervention 30 octobre 2012
5 déc. 2011 à 12:41
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
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
2 déc. 2011 à 08:51
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
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
1 déc. 2011 à 18:53
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
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
1 déc. 2011 à 18:37
Bonjour
Ou l'utilisation de l'objet fileSystemObject de la bibliothèque vbrunscript.
JJDai
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
1 déc. 2011 à 07:36
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 ?
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
1 déc. 2011 à 02:13
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
Rejoignez-nous