Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Optimiser le comptage du nombre de fichier

6 réponses
Avatar
toto
Bonjour tout le monde,

Je souhaite optimiser ce programme qui permet de compter le nombre de
fichier dans un repertoire.

set fso=new filesystemobject
set dossier=fso.getfolder("c:\photo")
for each fichier in dossier.files
nfiles=nfiles+1
redim preserve tableau(1 to nfiles)
sa=fichier
tableau(nfiles)=sa
next
for each sousdossier in dossier.subfolders
scan sousdossier
next

msgbox nfiles

Pour trouver 10000 fichiers, il mettait plus de 5 minutes
sur une machine Amd Athlon 64 3200+ avec 1 giga de ram

merci d'avance

yann

6 réponses

Avatar
Gilles MOUGNOZ
Bonjour, Toto
Tu peux utiliser la propriété Count de la collection Files pour définir la
dimension de ton tableau avant de rentrer dans la boucle:
redim preserve tableau(1 to dossier.files.Count)
C'est plus rapide ?
--
Bonne continuation
-------------------------------------------------------------------------------------------
"toto" a écrit :
Bonjour tout le monde,

Je souhaite optimiser ce programme qui permet de compter le nombre de
fichier dans un repertoire.

set fso=new filesystemobject
set dossier=fso.getfolder("c:photo")
for each fichier in dossier.files
nfiles=nfiles+1
redim preserve tableau(1 to nfiles)
sa=fichier
tableau(nfiles)=sa
next
for each sousdossier in dossier.subfolders
scan sousdossier
next

msgbox nfiles

Pour trouver 10000 fichiers, il mettait plus de 5 minutes
sur une machine Amd Athlon 64 3200+ avec 1 giga de ram

merci d'avance

yann



Avatar
Vincent Guichard
toto a écrit :
Bonjour tout le monde,

Je souhaite optimiser ce programme qui permet de compter le nombre de
fichier dans un repertoire.

set fso=new filesystemobject



fso est connu pour sa simplicité d'utilisation... et sa lenteur.

cf http://faq.vb.free.fr/index.php?question6

Vincent Guichard
Avatar
jm
"toto" wrote in message
news:4564257e$0$18803$
Bonjour tout le monde,




Hello,


Je souhaite optimiser ce programme qui permet de compter le nombre de
fichier dans un repertoire.



OK.

set fso=new filesystemobject
set dossier=fso.getfolder("c:photo")
for each fichier in dossier.files
nfiles=nfiles+1
redim preserve tableau(1 to nfiles)



STOP !!!

Pas la peine d'aller plus loin, tout le problème
est ici. Redim preserve est extrèmement lent.

En plus de ce qu'on déjà signalé les autres (éviter FSO),
la solution consiste à préallouer tableau, ou alors à l'allouer
par blocs.

Voici une fonction qui fait cela:

Option Explicit

Private Const ARRAY_GROW_FACTOR As Long = 2
Private Const ARRAY_INITIAL_SIZE As Long = 1

Private Function CountFiles(ByVal filesPattern As String, _
ByRef filesArray() As String) As Long
Dim fileName As String
Dim numberFiles As Long
Dim sizeArray As Long

sizeArray = ARRAY_INITIAL_SIZE
ReDim filesArray(sizeArray)

fileName = Dir$(filesPattern)
While fileName <> ""
numberFiles = numberFiles + 1
If numberFiles > sizeArray Then
sizeArray = sizeArray * ARRAY_GROW_FACTOR
ReDim Preserve filesArray(sizeArray)
End If
filesArray(numberFiles) = fileName
fileName = Dir$
Wend
CountFiles = numberFiles
End Function

Et l'appel de la fonction:

Private Sub Command2_Click()

Dim MyPattern As String
Dim MyNumberOfFiles As Long
Dim MyArrayFiles() As String

MyPattern = "c:tmp*.*"
MyNumberOfFiles = CountFiles(MyPattern, MyArrayFiles)

End Sub


Toute l'astuce est d'allouer à chaque fois que tu as besoin
en grossissant d'un facteur 2 à chauqe fois.
Tu vas donc allouer:
2, 4, 8, 16, 32, 64, 128, 256, 512, ..., 16384, 32768

En tout, tu ne vas faire que 16 ou 17 "Redim Preserve", au lieu
de 10000 ou 20000.

Pour un répertoire contenant 20000 fichiers, c'est si rapide
que je ne peux pas mesurer "à la main".

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
mailto: remove '_no_spam_' ;
FAQ VB: http://faq.vb.free.fr/
Avatar
jm
"jm" wrote in message
news:45644928$0$31463$
"toto" wrote in message
news:4564257e$0$18803$
Bonjour tout le monde,





Après réflexion, il semble que dans ton cas la
lenteur vienne vraiment de FSO, car même si il
reste vrai que Redim Preserve est très lent, ça
ne suffisait pas à expliquer une telle lenteur.

--
Jean-marc
Avatar
toto
bonjour,

j'ai oublié de préciser que le programme FSO cherche dans tous les sous
répertoires.

"jm" a écrit dans le message de news:
4564570f$0$1133$
"jm" wrote in message
news:45644928$0$31463$
"toto" wrote in message
news:4564257e$0$18803$
Bonjour tout le monde,





Après réflexion, il semble que dans ton cas la
lenteur vienne vraiment de FSO, car même si il
reste vrai que Redim Preserve est très lent, ça
ne suffisait pas à expliquer une telle lenteur.

--
Jean-marc





Avatar
jm
Hello,

Très facile à faire avec Dir$() aussi. Des tas d'exemples existent
sur Internet.

--
Jean-marc


"toto" wrote in message
news:4565722f$0$17494$
bonjour,

j'ai oublié de préciser que le programme FSO cherche dans tous les sous
répertoires.

"jm" a écrit dans le message de news:
4564570f$0$1133$
"jm" wrote in message
news:45644928$0$31463$
"toto" wrote in message
news:4564257e$0$18803$
Bonjour tout le monde,





Après réflexion, il semble que dans ton cas la
lenteur vienne vraiment de FSO, car même si il
reste vrai que Redim Preserve est très lent, ça
ne suffisait pas à expliquer une telle lenteur.

--
Jean-marc