2009-01-13 13 views
19

Necesito buscar una unidad (C :, D: etc.) para un tipo de archivo particular (extensión como .xml, .csv, .xls). ¿Cómo preformé una búsqueda recursiva para recorrer todos los directorios y directorios internos y devolver la ruta completa de dónde están los archivos? o ¿dónde puedo obtener información sobre esto?Búsqueda de archivos recurrentes en .net

VB.NET o C#

Gracias

Editar ~ Estoy funcionando en algunos errores como incapaz de acceder al sistema de acceso volumen negaron etc. ¿Alguien sabe donde puedo ver algo de código smaple en la implementación de un archivo ¿buscar? Solo necesito buscar una unidad seleccionada y devolver la ruta completa del tipo de archivo para todos los archivos encontrados.

Respuesta

20

¿Qué le parece esto? Evita la excepción lanzada a menudo por la búsqueda recursiva incorporada (es decir, obtiene acceso denegado a una sola carpeta, y toda su búsqueda muere), y se evalúa de forma perezosa (es decir, devuelve resultados tan pronto como los encuentra, en lugar de buffering 2000 resultados). El comportamiento lento le permite crear interfaces de usuario receptivas, etc., y también funciona bien con LINQ (especialmente 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 ... acabo de recibir un voto negativo de la nada, ¿me importa explicar por qué? –

+1

Tal vez es el uso de 'catch {}'. No quiero ofender, pero es una práctica bastante mala. Mejor detectar la excepción AccessDeniedException o DirectoryNotFoudnException, o lo que sea ... HTH – JamieH

+0

Gracias Marc. Eso es fantástico. –

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

Exactamente lo que quería. Simple y funciona. – NMunro

5

Parece que la biblioteca recls - siglas de rec ursive ls - ahora tiene un pure .NET implementation. Yo solo read about it in Dr Dobb's.

se utilizaría como:

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); 
     } 
    } 
Cuestiones relacionadas