Téléchargé 1 fois
Vote des utilisateurs
0
0
Détails
Licence : Libre
Mise en ligne le 2 novembre 2013
Langue : Français
Référencé dans
Navigation
Recherche de fichiers en fonction de l'extension en récursif avec le BackGroundWorker
Recherche de fichiers en fonction de l'extension en récursif avec le BackGroundWorker
Exemple d'utilisation du BackGroundWorker pour une recherche de fichier avec les méthodes Directory.GetFiles.
Permet de rechercher tous les fichiers d'une certaine extension dans tous les répertoires contenu dans un répertoire de départ et d'en afficher le chemin dans une listbox.
Permet de rechercher tous les fichiers d'une certaine extension dans tous les répertoires contenu dans un répertoire de départ et d'en afficher le chemin dans une listbox.
Je ne vois pas trop pourquoi tu te compliques la vie alors qu'une surcharge existe déjà Directory.GetFiles En fournissant SearchOption.AllDirectories, comme troisième paramètre, ça recherche dans tous les sous-dossiers.
De plus vu que ton projet est en .Net 4.0 alors autant passer par la méthode Directory.EnumerateFiles plus performante et évite les problèmes de mémoire pouvant être rencontrés avec la méthode Directory.GetFiles
De plus vu que ton projet est en .Net 4.0 alors autant passer par la méthode Directory.EnumerateFiles plus performante et évite les problèmes de mémoire pouvant être rencontrés avec la méthode Directory.GetFiles
Heu... Ce n'est pas en rapport avec la performance ça ?
Comme le dit la documentation :
The EnumerateFiles and GetFiles methods differ as follows: When you use EnumerateFiles, you can start enumerating the collection of names before the whole collection is returned; when you use GetFiles, you must wait for the whole array of names to be returned before you can access the array. Therefore, when you are working with many files and directories, EnumerateFiles can be more efficient.
Avec EnumerateFiles je n'attends pas que toute la collection de nom de fichiers soit renvoyée pour pouvoir commencer à faire le traitement. Le fait de ne pas attendre est un critère de performance non négligeable.
Comme le dit la documentation :
The EnumerateFiles and GetFiles methods differ as follows: When you use EnumerateFiles, you can start enumerating the collection of names before the whole collection is returned; when you use GetFiles, you must wait for the whole array of names to be returned before you can access the array. Therefore, when you are working with many files and directories, EnumerateFiles can be more efficient.
Bah ça commence plus vite à donner des résultats, mais si tu dois de toutes façons consommer tous les résultats, ce n'est pas plus rapide globalement.
En fait, je viens de faire un petit test : consommer tous les résultats de EnumerateFiles() prend le même temps que d'énumérer ceux de GetFiles()... (pour un répertoire de 13000 fichiers)
Voilà mon test dans LinqPad :
Résultats :
Je l'ai lancé plusieurs fois, ça reste à peu près pareil d'un run à l'autre.
Donc a priori l'intérêt principal d'EnumerateFiles est quand même d'économiser la mémoire...
En fait, je viens de faire un petit test : consommer tous les résultats de EnumerateFiles() prend le même temps que d'énumérer ceux de GetFiles()... (pour un répertoire de 13000 fichiers)
Voilà mon test dans LinqPad :
Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | void Main() { string path = @"D:\tmp"; // First run for JIT and filesystem warmup Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Consume(); Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories).Consume(); var sw = new Stopwatch(); sw.Start(); Directory.GetFiles(path, "*.*", SearchOption.AllDirectories).Consume(); sw.Stop(); sw.Elapsed.Dump("GetFiles"); sw.Reset(); sw.Start(); Directory.EnumerateFiles(path, "*.*", SearchOption.AllDirectories).Consume(); sw.Stop(); sw.Elapsed.Dump("EnumerateFiles"); } static class Extensions { public static void Consume<T>(this IEnumerable<T> source) { foreach (var element in source) { } } } |
GetFiles
00:00:00.1865426
EnumerateFiles
00:00:00.1872549
00:00:00.1865426
EnumerateFiles
00:00:00.1872549
Donc a priori l'intérêt principal d'EnumerateFiles est quand même d'économiser la mémoire...
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.