2010-04-01 22 views
5

Todos los ejemplos que veo parece ser para conseguir de forma recursiva archivos en los subdirectorios utiliza sólo los archivos. Lo que estoy tratando de hacer es buscar una carpeta para un subdirectorio determinado, llamado "xxx" a continuación, guarde ese camino a una variable para que pueda usarlo para otras cosas.C# Buscar subdirectorio (no para archivos)

¿Es esto posible sin bucle a través de todos los directorios y comparando por su nombre?

Respuesta

8

Bueno

Directory.GetDirectories(root); 

le devolverá una matriz de los subdirectorios.

continuación, puede utilizar LINQ para encontrar el que usted está interesado en:

IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test")); 

que no es un bucle en el código, pero sigue siendo un bucle sin embargo. Entonces la respuesta final es que "no, no puedes encontrar una carpeta 'prueba' sin bucle".

Puede agregar .SingleOrDefault() al Linq, pero eso dependerá de lo que desee hacer si no se encuentra su carpeta de "prueba".

Si cambia la llamada GetDirectories para incluir la SearchOption SearchOption.AllDirectories, entonces hará la recursión por usted también. Obviamente, en este caso, la llamada podría devolver más de un elemento si hubiera más de una carpeta llamada "prueba" en su árbol de directorios.

+1

+1 "Esto solo debería devolver un elemento". podrías hacer que sea un contrato al agregar .SingleOrDefault() al final de tu extracto :-) EDITAR: y luego, obviamente, devolver el hilo. doh –

+0

@David - de hecho, aunque es posible que no desee devolver nada si no se puede encontrar el subdirectorio. Actualizaré mi respuesta. – ChrisF

+0

@ChrisF, sí el "...OrDefault "significa que se devolverá nulo si no se encuentra un elemento coincidente, a menos que haya olvidado una sutileza en lo que decía :-( –

0

Sí, creo que la única solución disponible (por debajo de bibliotecas de terceros) es una búsqueda recursiva para el directorio a través de la comparación del nombre.

1

En primer lugar, "No, no es posible sin recorrer todos los directorios y comparar por nombre".

Creo que su verdadera pregunta es "¿Hay una API existente que manejará el bucle en todos los directorios y comparando por mi nombre?"

Sí, la hay. Se llama Directory.Exists():

var xxxPath = Path.Combine(parentFolder, "xxx"); 
if (Directory.Exists(xxxPath)) 
    savedPath = xxxPath; 
6
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories) 

Esto devolverá una matriz de cadenas con todas las carpetas que se encuentran con el nombre dado. Puede cambiar el último parámetro para que solo compruebe los directorios de nivel superior y puede cambiar la raíz para ajustar desde dónde comienza.

0

Aquí hay un fragmento de la búsqueda de una carpeta mediante dos filtros, mientras que teniendo en cuenta para la UnauthorizedAccessException, puede ser reprogramado para utilizar sólo un filtro: ejemplo

public static string FindGitPath(string firstFilter, string secondFilter, string initialPath) 
    { 
     string gitPath = string.Empty; 
     foreach (var i in Directory.GetDirectories(initialPath)) {   
      try { 
       foreach (var f in Directory.GetDirectories(i, firstFilter, SearchOption.AllDirectories)) { 
        foreach (var s in Directory.GetDirectories(f)) { 
         if (s == Path.Combine(f,secondFilter)) { 
          gitPath = f; 
          break; 
         } 
        } 
       }  
      } catch (UnauthorizedAccessException) { 
       Console.WriteLine("Path is not accessible: {0}", i); 
      }        
     } 
     return gitPath; 
    } 

Uso:

Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\")); 
Cuestiones relacionadas