2009-10-30 5 views
7

Existe-t-il un moyen (sous Windows utilisant Delphi 2010) d'obtenir le nombre de fichiers dans un répertoire sans réellement parcourir tous les fichiers?Comment puis-je récupérer efficacement le nombre de fichiers dans un répertoire?

Je souhaite implémenter une barre de progression pendant certaines opérations d'indexation de système de fichiers. Pour cette raison, j'ai besoin de savoir combien de fichiers sont dans le répertoire.

Quel est le moyen le plus rapide d'obtenir le nombre de fichiers dans un répertoire?

Répondre

8

Je pense que le moyen le plus rapide consiste à utiliser la méthode TDirectory.GetFiles située dans IOutils.pas. Comme le nombre de fichiers (visibles) dans un répertoire peut être différent pour chaque utilisateur, il y a seulement une petite chance qu'il y ait juste un nombre à récupérer d'une manière ou d'une autre. L'approche FindFirst/FindNext (qui est enveloppée dans la méthode ci-dessus) ne traverse pas réellement les fichiers, elle ne traverse que les entrées d'une table, elle peut donc être plus rapide que prévu.

10

Si vous utilisez Windows 7 ou Server 2008 R2, je recommande d'extraire les fonctions FindFirst et FindMatchingFile de SysUtils et de les pirater pour utiliser FindFirstFileEx au lieu de FindFirstFile. Ensuite, vous pouvez définir le paramètre flags supplémentaires à 2 (défini dans MSDN comme FIND_FIRST_EX_LARGE_FETCH) avec ce paramètre conditionné sur (Win32majorversion = 6) et (Win32minorversion> = 1), pour le moment.

Ce paramètre produit une augmentation de vitesse très importante pour les boucles FindFirst/FindNext sur ces systèmes d'exploitation. Recherchez FindFirstFileEx sur MSDN pour plus de détails, car la documentation la plus récente ne figure pas dans la documentation Microsoft récupérée par l'aide de Delphi. Il semblerait que TDirectory.GetFiles appelle finalement FindFirst, ce qui ne vous procurera pas beaucoup d'avantages si ce n'est de simplifier votre propre code.

+2

+1 intéressant! – jpfollenius

+0

Vous pouvez également utiliser le niveau d'information FindExInfoBasic, il désactive la récupération des anciens noms de fichiers courts –