.net - DirectoryInfo.GetDirectories() y atributos
directoryinfo getfiles (4)
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.
@rslite tiene razón, .NET no ofrece este tipo de filtrado desde el principio, pero no es difícil de implementar:
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;
}
}
}
Enlaces de MSDN:
Probablemente tenga que recorrer los resultados y rechazar aquellos con los atributos que no desea (use la propiedad Atributos).
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 está construyendo una aplicación .net v2, puede usar LinqBridge para darle acceso a todos los lindos métodos Linq a objetos (como Where () y ToArray () arriba).
Editar
En .net v4, usaría EnumerateDirectories en lugar de GetDirectories, lo que le permite iterar sobre los resultados sin construir primero una matriz en la memoria.
public static IEnumerable<DirectoryInfo> EnumerateNonSystemDirectories(
this DirectoryInfo directory,
string searchPattern,
SearchOption searchOption)
{
return directory.EnumerateDirectories(searchPattern, searchOption)
.Where(subDir => (subDir.Attributes & FileAttributes.System) == 0);
}
Usando el último Sweet Linq
IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);