Как исключить папки при использовании 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));