Recherche de fichiers en fonction de l'extension en récursif avec le BackGroundWorker

Présentation
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.
Téléchargement
0  0 
Téléchargé 9 fois Voir les 4 commentaires
Détails
Catégories : Codes sources C#
Avatar de Eric Metz
Membre expert
Voir tous les téléchargements de l'auteur
Licence : Libre
Date de mise en ligne : 2 novembre 2013




Avatar de - https://www.developpez.com
le 02/11/2013 à 22:50
Citation Envoyé par infosam76 Voir le message

Qu'en pensez-vous ?
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
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 03/11/2013 à 2:45
Citation Envoyé par h2s84 Voir le message
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
C'est pas plus performant, mais ça a l'avantage d'être lazy... les fichiers sont énumérés au fur et à mesure que la séquence résultat est consommée.
Avatar de - https://www.developpez.com
le 03/11/2013 à 13:01
Citation Envoyé par tomlev Voir le message
[...] les fichiers sont énumérés au fur et à mesure que la séquence résultat est consommée.
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.
Avatar de tomlev tomlev - Rédacteur/Modérateur https://www.developpez.com
le 03/11/2013 à 15:17
Citation Envoyé par h2s84 Voir le message
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.
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 :

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)
        {
        }
    }
}
Résultats :

GetFiles
00:00:00.1865426

EnumerateFiles
00:00:00.1872549
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...

 
Developpez.com décline toute responsabilité quant à l'utilisation des différents éléments téléchargés.