IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Contribuez .NET Discussion :

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


Sujet :

Contribuez .NET

  1. #1
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut Recherche de fichiers en fonction de l'extension en récursif avec le BackGroundWorker
    Bonjour,

    Je vous propose un nouvel élément à utiliser : 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.

    Qu'en pensez-vous ?
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  2. #2
    Invité
    Invité(e)
    Par défaut
    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

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    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.

  4. #4
    Invité
    Invité(e)
    Par défaut
    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.
    Dernière modification par Invité ; 03/11/2013 à 13h57.

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    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 - Visualiser dans une fenêtre à part
    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...

Discussions similaires

  1. supprimer des fichiers en fonction de leur extension
    Par nekcorp dans le forum Général Python
    Réponses: 6
    Dernier message: 14/05/2014, 18h26
  2. lancer un fichier en fonction de son extension
    Par nekcorp dans le forum Scripts/Batch
    Réponses: 4
    Dernier message: 09/09/2009, 14h26
  3. Réponses: 2
    Dernier message: 21/08/2009, 12h18
  4. écrire une liste de fichiers en fonction de leur extension
    Par seb.garcia dans le forum Général Python
    Réponses: 5
    Dernier message: 10/01/2009, 15h06
  5. Réponses: 2
    Dernier message: 18/01/2008, 11h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo