2008-09-19 10 views
6

Estoy usando DirectoryInfo.GetDirectories() recursivamente para encontrar todos los subdirectorios bajo una ruta determinada. Sin embargo, quiero excluir las carpetas del sistema y no hay una manera clara para eso. En FindFirstFile/FindNextFile las cosas fueron más claras con los atributos.DirectoryInfo.GetDirectories() y atributos

Respuesta

8

@rslite es correcto, .NET no da tales filtrado fuera de la caja, pero no es difícil de poner en práctica:

enlaces
static IEnumerable<string> GetNonSystemDirs(string path) 
{ 
    var dirs = from d in Directory.GetDirectories(path) 
       let inf = new DirectoryInfo(d) 
       where (inf.Attributes & FileAttributes.System) == 0 
       select d; 

    foreach (var dir in dirs) 
    { 
     yield return dir; 
     foreach (var subDir in GetNonSystemDirs(dir)) 
     { 
      yield return subDir; 
     } 
    } 
} 

MSDN:

FileSystemInfo.Attributes Property

FileAttributes Enumeration

0

Probablemente tenga que recorrer los resultados y rechazar aquellos con los atributos que no desea (use la propiedad Atributos).

3

Este es un gran ejemplo de un escenario donde Linq y los métodos de extensión hacen que las cosas sean realmente limpias y fáciles.

public static DirectoryInfo[] GetNonSystemDirectories(
    this DirectoryInfo directory, 
    string searchPattern, 
    SearchOption searchOption) 
{ 
    return directory.GetDirectories(searchPattern, searchOption) 
     .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0) 
     .ToArray(); 
} 

Si usted está construyendo una aplicación .NET v2, entonces se puede utilizar LinqBridge para darle acceso a toda la fresca LINQ a métodos de objetos (como Donde() y ToArray() anterior).

Editar

En .net v4 tendrá que utilizar EnumerateDirectories en lugar de GetDirectories que le permite iterar sobre los resultados sin la construcción de una matriz en la memoria primero.

public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
    this DirectoryInfo directory, 
    string searchPattern, 
    SearchOption searchOption) 
{ 
    return directory.EnumerateDirectories(searchPattern, searchOption) 
     .Where(subDir => (subDir.Attributes & FileAttributes.System) == 0); 
} 
+0

Directory.GetDirectories devuelve cadenas, ¿cómo se consigue Atributos de ella? :) – aku

+0

@aku Estoy utilizando el método de instancia DirectoryInfo.GetDirectories, no el Directory.GetDirectories estático. –

+0

No es tan eficiente/utilizable como la creación de un verdadero iterador recursivo que usa rendimiento devuelto. En las jerarquías de directorios grandes que usan SearchOption.AllDirectories no es tan bueno. – Ash

0

Usando lo último dulce LINQ

IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName); 
Cuestiones relacionadas