2009-01-13 5 views
19

Je dois rechercher un lecteur (C :, D: etc) pour un type de fichier parti- culier (extension comme .xml, .csv, .xls). Comment préformer une recherche récursive pour boucler tous les répertoires et répertoires internes et renvoyer le chemin complet de l'emplacement du (des) fichier (s)? ou où puis-je obtenir des informations à ce sujet?Recherche de fichier récursive dans .net

VB.NET ou C#

Merci

Edition ~ Je suis en cours d'exécution dans des erreurs comme l'impossibilité d'accéder à l'accès du volume du système a nié avoir etc. Est-ce que quelqu'un sait où je peux voir le code smaple sur la mise en œuvre d'un fichier chercher? J'ai juste besoin de rechercher un lecteur sélectionné et de renvoyer le chemin complet du type de fichier pour tous les fichiers trouvés.

Répondre

20

Que pensez-vous de cela? Il évite l'exception souvent lancée par la recherche récursive intégrée (par exemple, vous obtenez un accès refusé à un seul dossier, et votre recherche entière meurt), et est évaluée paresseusement (c'est-à-dire qu'elle renvoie les résultats dès qu'elle les trouve, plutôt que buffering 2000 résultats). Le comportement paresseux vous permet de créer des interfaces utilisateur réactives, etc., et fonctionne également bien avec LINQ (en particulier First(), Take(), etc.).

using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach (string match in Search("c:\\", "*.xml")) { 
      Console.WriteLine(match); 
     } 
    } 
    static IEnumerable<string> Search(string root, string searchPattern) { 
     Queue<string> dirs = new Queue<string>(); 
     dirs.Enqueue(root); 
     while (dirs.Count > 0) { 
      string dir = dirs.Dequeue(); 

      // files 
      string[] paths = null; 
      try { 
       paths = Directory.GetFiles(dir, searchPattern); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string file in paths) { 
        yield return file; 
       } 
      } 

      // sub-directories 
      paths = null; 
      try { 
       paths = Directory.GetDirectories(dir); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string subDir in paths) { 
        dirs.Enqueue(subDir); 
       } 
      } 
     } 
    } 
} 
+0

Hmm ... vient de recevoir un downvote à l'improviste - vous vous demandez pourquoi? –

+1

Peut-être que c'est l'utilisation de 'catch {}'. Je ne veux pas offenser, mais c'est une mauvaise pratique. Mieux vaut attraper l'exception AccessDeniedException ou DirectoryNotFoudnException, ou quoi que ce soit ... HTH – JamieH

+0

Merci Marc. C'est fantastique. –

52
System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories); 
+0

Exactement ce que je voulais. Simple et fonctionne. – NMunro

5

Il ressemble à la bibliothèque recls - est synonyme de rec ursive ls - a maintenant un pure .NET implementation. Je viens de read about it in Dr Dobb's.

serait utilisé comme:

using Recls; 
using System; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach(IEntry e in FileSearcher.Search(@"c:\", "*.xml|*.csv|*.xls")) { 
      Console.WriteLine(e.Path); 
     } 
    } 
Questions connexes