Quiero devolver una lista de todos los subdirectorios en el ‘SomeFolder’ directorio excluyendo el ‘Admin’ y ‘Plantillas’ directorios.

Tengo la siguiente estructura de carpetas (simplificado):

    C:\inetpub\wwwroot\MyWebsite\SomeFolder\RandomString
    C:\inetpub\wwwroot\MyWebsite\SomeFolder\RandomString
    C:\inetpub\wwwroot\MyWebsite\SomeFolder\RandomString
    C:\inetpub\wwwroot\MyWebsite\SomeFolder\Admin 
    C:\inetpub\wwwroot\MyWebsite\SomeFolder\Templates 

‘SomeFolder’ puede contener un número variable de un ‘RandomString’ carpetas (en cualquier lugar de ~10 ~100).

Aquí es lo que he intentado:

    var dirs = Directory.GetDirectories(Server.MapPath(".."))
    .Where(s => !s.EndsWith("Admin") || !s.EndsWith("Templates"));
    foreach (string dir in dirs)
    {
        lit.Text += Environment.NewLine + dir;
    }

Esta devuelve la lista completa de carpetas (se muestra arriba) sin ‘Admin’ y ‘Plantillas’ filtrados.

Curiosamente, si puedo cambiar el LINQ .Where cláusula incluyen, en lugar de excluir, ‘Admin’ y ‘Plantillas’ funciona, lo que significa que sólo se devuelven las rutas de acceso para ‘Admin’ y ‘Plantillas’.

.Where(s => s.EndsWith("Admin") || s.EndsWith("Templates"));

Si LINQ no es la solución, ¿hay alguna forma de usar el GetDirectories SearchPattern para filtrar los directorios?

  • .Where(it => !ExcludedFolders.Any(it.Contains)); y private IEnumerable<string> ExcludedFolders { get; } = new[] { "Admin", "Templates" };
InformationsquelleAutor Dhaust | 2013-06-11

2 Comentarios

  1. 8

    el opuesto de (A || B) es (!A && !B), por lo que en el código que debe ser &&, no ||…

    • Sí, eso era. Gracias. Lo que es un error de novato. Incluso había tenido una (obviamente demasiado rápido) buscar en el C# operadores de referencia para asegurarse de que debo tener, usando el condicional y no la lógica. Acepte a la hora de los 10 min de la ventana hacia arriba.
  2. 6

    Puedes hacer algo como:

    //list your excluded dirs
    private List<string> _excludedDirectories= new List<string>() { "Admin", "Templates" };
    
    //method to check
    static bool isExcluded(List<string> exludedDirList, string target)
    {
        return exludedDirList.Any(d => new DirectoryInfo(target).Name.Equals(d));
    }
    
    //then use this
    var filteredDirs = Directory.GetDirectories(path).Where(d => !isExcluded(_excludedDirectories, d));
    • wow sorprendentemente, cuando he buscado esto, he encontrado este. muy similar a la mía.
    • Esta es una buena solución limpia. Yo estoy haciendo un servidor completo. ¿Cree usted que el rendimiento será mejor si yo no uso DirectoryInfo y el uso de la manipulación de cadenas. Es decir tagert.EndWith(d)
    • significativo aumento en el rendimiento? no. Yo no lo creo.
    • respuesta como la mejor, sin duda! La respuesta está trabajando para este ejemplo, pero esta solución es limpio y fácil de mantener si se necesita agregar carpetas o quitar carpetas sin hacer un gran && || && concat

Dejar respuesta

Please enter your comment!
Please enter your name here