2009-07-07 6 views
2

Si je veux vérifier combien de fichiers il y a dans un dossier (où il est susceptible d'être 10.000+ fichiers), est-il un moyen plus efficace que ...fichiers de comptage dans un répertoire en utilisant .Net

Public Function FileCount(FolderName as String) As Integer 

    Dim Files() As String 

    Files = IO.Directory.GetFiles(FolderName) 

    Return Files.Length 

End Function 

Il semble difficile d'être obligé de charger un tel tableau potentiellement grand. De meilleures suggestions?

Répondre

4

a-t-il causé un problème? Ce n'est pas comme si GetFiles() renvoyait le contenu de chaque fichier, il vous renvoie leurs chemins , c'est-à-dire un tableau de chaînes.

+0

Encore, 10.000 fois ~ 12 (être optimiste, 8.3) est 120.000 octets, ce qui est un morceau de mémoire considérable pour obtenir un nombre entier ... Pourtant, vous avez probablement raison sur l'optimisation prématurée ... –

+0

120 kilo-octets .. .Pour environ une fraction de seconde ... Je ne m'inquiéterais pas vraiment. –

+0

Étant donné que chaque élément de tableau contient le chemin d'accès complet ainsi que le nom de fichier, la taille moyenne est d'environ 60 caractères par fichier. Il est donc nécessaire de créer un bloc de mémoire de 600 Ko (pour une période limitée). Numéro unique. C'est généralement ce genre d'inefficacité qui s'additionne. Mais ... la mémoire et l'électricité sont bon marché - pour l'instant. – Bill

-3

Non Je pense

Mais vous pouvez retourner IO.Directory.GetFiles (NomDossier) .Length

+0

En quoi est-ce différent? – SolutionYogi

+0

Non, je n'ai pas dit son différent, j'ai seulement enlevé 3 lignes de code à une seule ligne. C'est tout. – Anuraj

+0

Vous devez encore stocker l'objet temporaire, il n'y a pas de différence –

1

Il est peut-être insuffisant, mais si vous exécutez un test et constatez que l'impact sur les performances est minime, il se peut que ce soit toujours la solution appropriée.

0

Je ne pense pas que ce soit un problème. Sous le capot les fichiers ne sont pas ouverts de toute façon, l'appel de fonction interroge uniquement l'index de fichier disque ou la table d'allocation de fichiers pour les fichiers sous ce dossier. Ce n'est pas différent de faire un dir sur l'invite de commande.

La meilleure façon de voir si cela cause vraiment un problème est de le profiler.

3

Malheureusement, vous ne pouvez pas énumérer le contenu d'un répertoire dans .NET 3.5 sans utiliser interop ou obtenir tous les chemins à l'avance. Comme mentionné, l'inconvénient d'utiliser File.GetFiles() est qu'il renvoie tous les chemins à la fois, ce qui peut consommer plus de ressources que nécessaire.

Si vous souhaitez énumérer le contenu du répertoire et incrémenter un compteur au cours de l'énumération, vous pouvez essayer l'une des options suivantes.

  • L'utilisation interop .NET, appelez FindFirstFile et FindNextFile avec le ., en incrémentant un compteur pour chaque invocation réussie.
  • Utilise features of .NET 4.0 qui vous permet d'obtenir un IEnumerable<T> pour l'énumération du contenu d'un répertoire.

Chaque fois que interop est utilisé, vous devriez vous préoccuper des performances de la génération d'appels WinAPI natifs à partir du code managé. Envisagez d'utiliser un profileur pour déterminer si la pénalité de performance est acceptable.

+0

Cumuler cela parce que c'est une réponse de haute qualité. GetFiles est bien pour 10 000 fichiers. Vous allez pleurer si vous l'utilisez pour compter un répertoire contenant des millions de fichiers. – MrB

Questions connexes