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
@rslite es correcto, .NET no da tales filtrado fuera de la caja, pero no es difícil de poner en práctica:
enlacesstatic 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:
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 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);
}
Usando lo último dulce LINQ
IEnumerable<string> directories = new DirectoryInfo(path).GetDirectories().Where(a => (a.Attributes & FileAttributes.System) == 0).Select(a => a.FullName);
- 1. ¿Es esto un error en DirectoryInfo.GetDirectories (string searchPattern)?
- 2. mass_assignment_authorizer y atributos anidados
- 3. python: atributos de clase y atributos de instancia
- 4. autoclase y atributos de instancia
- 5. C# Atributos y sus usos
- 6. DllImport - PreserverSig y SetLastError atributos
- 7. Atributos HTML personalizados y jQuery
- 8. Atributos virtuales y asignación masiva
- 9. Descriptores y atributos provistos por Python
- 10. Atributos y excepciones personalizados en .net
- 11. XSD: minInclusive y de atributos juntos
- 12. serialización XML de DataContract y atributos XML
- 13. Atributos y documentación XML para método/propiedad
- 14. DataContract y DataMember atributos - cómo afectan tipo
- 15. diferencia entre los parámetros y atributos
- 16. Atributos de MVC en controladores y acciones
- 17. Atributos y parámetros de matriz CLS
- 18. Atributos dinámicos con Rails y Mongoid
- 19. OpenGL ES 2: Uniformes y atributos
- 20. Lista de objetos y atributos JMX?
- 21. C# delegado y atributos pregunta sintaxis
- 22. Magento y atributos configurables del producto
- 23. Comprender la estructura JSON - atributos y valores
- 24. ataques XSS y los atributos de estilo
- 25. Scala Patrón XML a juego y atributos
- 26. Git en Windows y atributos de archivo
- 27. JavaScript - crear elemento y establecer atributos
- 28. Obtiene atributos y valores usando SimpleXML
- 29. XmlSerializer y atributos que aceptan nulos
- 30. Elemento XSD con atributos y elementos secundarios
Directory.GetDirectories devuelve cadenas, ¿cómo se consigue Atributos de ella? :) – aku
@aku Estoy utilizando el método de instancia DirectoryInfo.GetDirectories, no el Directory.GetDirectories estático. –
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