如何在使用Directory.GetDirectories时排除文件夹

Dha*_*ust 3 c# linq asp.net 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 
Run Code Online (Sandbox Code Playgroud)

'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;
    }
Run Code Online (Sandbox Code Playgroud)

这将返回完整的文件夹列表(如上所示),而不会过滤掉"管理员"和"模板".

有趣的是,如果我将LINQ .Where子句更改为包含而不是排除,则"管理"和"模板"可以正常工作,这意味着它只返回"管理员"和"模板"的路径.

.Where(s => s.EndsWith("Admin") || s.EndsWith("Templates"));
Run Code Online (Sandbox Code Playgroud)

如果LINQ不是解决方案,有没有办法使用GetDirectories SearchPattern过滤掉目录?

Zdr*_*nev 8

与(A || B)相反的是(!A &&!B),所以在你的代码中它应该是&&,而不是|| ...

  • 是的,就是这样。谢谢。真是个菜鸟的错误。我什至(显然太快了)查看C#运算符引用,以确保我应该使用条件语句而不是逻辑语句。10分钟窗口打开时将接受。 (2认同)

aia*_*tag 7

你可以这样做:

//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));
Run Code Online (Sandbox Code Playgroud)

  • 哇,令人惊讶的是,当我搜索这个时,我找到了 [这个](http://stackoverflow.com/questions/10003440/c-sharp-directory-getdirectories- exclude-folders)。与我的非常相似。 (2认同)
  • 这是一个很好的清洁解决方案。我正在做一个完整的服务器。如果我不使用 DirectoryInfo 并使用字符串操作,您认为性能会更好吗?IE tagert.EndWith(d) (2认同)
  • 绝对是最好的答案!选择的答案适用于此示例,但是如果您需要添加文件夹/删除文件夹而又不占用大量&amp;&amp; ||,则此解决方案是干净且易于维护的 &amp;&amp; concat (2认同)