Как исключить папки при использовании Directory.GetDirectories

Я хочу вернуть список всех подкаталогов в каталоге SomeFolder, за исключением каталогов Admin и Templates.

У меня есть следующая структура папок (упрощенно):

    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 может содержать различное количество папок RandomString (от ~10 до ~100).

Вот что я попробовал:

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

Это возвращает полный список папок (показанный выше) без отфильтрованных "Admin" и "Templates".

Интересно, если я поменяю LINQ .Where условие, чтобы включить, вместо exclude, "Admin" и "Templates", это работает, то есть возвращает только пути для "Admin" и "Templates".

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

Если LINQ не является решением, есть ли способ использовать GetDirectories SearchPattern для фильтрации каталогов?

2 ответа

Решение

Противоположность (A || B) - это (!A &&!B), поэтому в вашем коде это должно быть &&, а не ||...

Вы можете сделать что-то вроде:

//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));
Другие вопросы по тегам