C# 如何在使用Directory.GetDirectories时排除文件夹
我想返回“SomeFolder”目录中所有子目录的列表,不包括“Admin”和“Templates”目录 我有以下文件夹结构(简化): “SomeFolder”可以包含数量不等的“RandomString”文件夹(从~10到~100之间的任意位置) 以下是我尝试过的:C# 如何在使用Directory.GetDirectories时排除文件夹,c#,asp.net,linq,getdirectories,C#,Asp.net,Linq,Getdirectories,我想返回“SomeFolder”目录中所有子目录的列表,不包括“Admin”和“Templates”目录 我有以下文件夹结构(简化): “SomeFolder”可以包含数量不等的“RandomString”文件夹(从~10到~100之间的任意位置) 以下是我尝试过的: var dirs = Directory.GetDirectories(Server.MapPath("..")) .Where(s => !s.EndsWith("Admin") || !s.EndsWit
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
子句更改为包含而不是排除'Admin'和'Templates',它就会工作,这意味着它只返回'Admin'和'Templates'的路径
.Where(s => s.EndsWith("Admin") || s.EndsWith("Templates"));
如果LINQ不是解决方案,有没有办法使用GetDirectories SearchPattern过滤掉目录?与(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));
//列出排除的目录
私有列表_excludedDirectories=new List(){“Admin”,“Templates”};
//检查方法
静态布尔值已排除(列表排除dirlist,字符串目标)
{
返回exludedDirList.Any(d=>newDirectoryInfo(target.Name.Equals(d));
}
//那就用这个
var filteredDirs=Directory.GetDirectories(path).Where(d=>!isExcluded(_excludedDirectories,d));
是的,就是这样。谢谢真是个新手犯的错误。我甚至(显然太快)查看了C#operators引用,以确保我应该使用条件而不是逻辑。当10分钟窗口打开时,我将接受。哇,令人惊讶的是,当我搜索这个时,我发现了。和我的非常相似。这是一种很好的清洁溶液。我正在做一个完整的服务器。您认为如果我不使用DirectoryInfo和字符串操作,性能会更好吗。IE tagert.EndWith(d)@H20rider,显著提升性能?不,我不这么认为。绝对是最好的答案!选择的答案适用于本例,但如果您需要添加/删除文件夹,而无需创建一个巨大的&&&&&&|&&concat,则此解决方案干净且易于维护。其中(it=>!ExcludedFolders.Any(it.Contains))
和private IEnumerable ExcludedFolders{get;}=new[]{“Admin”,“Templates”}代码>
//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));