【问题标题】:how to delete all folders except some folders如何删除除某些文件夹以外的所有文件夹
【发布时间】:2018-06-15 09:43:58
【问题描述】:

您好,我需要删除一个文件夹中的所有文件夹,但我卡住了,因为我不需要删除两个文件夹。我想做这样的事情:

string[] dir = Directory.GetDirectories(getDir());

foreach(string r in (dir.Where(x => x.Contains("AutomaticRecepes") == false))&& 
dir.Where(y => y.Contains("SpecialRecepes") == false))
{
    Directory.Delete(r, true);
}

如您所见,我希望(使用几行代码)删除所有文件夹,但名称为 AutomaticRecepes 和 SpecialRecepes 的文件夹除外。

当然我写的代码会报错:

运算符 && 不能应用于“system.collections.generic.ienumerable”和“system.collections.generic.ienumerable”类型的操作数

我该怎么做?

谢谢

【问题讨论】:

  • 你必须通过删除最后的括号来替换... x.Contains("AutomaticRecepes") == false)) 所以... x.Contains("AutomaticRecepes") == false)

标签: c# linq foreach


【解决方案1】:

您必须将条件更改为:

foreach(string r in dir.Where(x => x.Contains("AutomaticRecepes") == false && x.Contains("SpecialRecepes") == false))
{
    Directory.Delete(r, true);
}

&& 用于连接布尔表达式,但由于Where 返回IEnumerable,因此会产生错误。

【讨论】:

  • 究竟是什么“没用”。请更具体。
【解决方案2】:
    dir.Where(x => !x.Contains("AutomaticRecepes") && !x.Contains("AutomaticRecepes"))
.ToList().ForEach(x=> Directory.Delete(x, true));

【讨论】:

    【解决方案3】:

    试试这个:

    var toExclude = new []{"AutomaticRecepes", "SpecialRecepes"};
    var dir = Directory.GetDirectories(getDir()).Where(x => !toExclude.Any(y => x.Contains(y)));
    
    foreach(string r in dir)
    {
        Directory.Delete(r, true);
    }
    

    【讨论】:

      【解决方案4】:

      我建议你创建一个DirectoryInfo 的新实例,这样你就可以检查文件夹的名称。如果您在文件夹的整个路径中使用 Contains 并且您的文件夹的父名称具有排除文件夹的名称,则您的代码将不起作用(例如文件夹“SpecialRecepes”中名为“to-delete”的目录将不起作用被删除)。

      var dirs = new DirectoryInfo(getDir()).EnumerateDirectories(getDir())
          .Where(x => x.Name != "AutomaticRecepes" && x.Name != "SpecialRecepes");
      
      foreach (var dir in dirs)
      {
          dir.Delete(true);
      }
      

      【讨论】:

        【解决方案5】:

        语句的复杂性使您难以阅读并且似乎使您感到困惑。我建议通过将其分解为多个像这样的单独语句来使其更具可读性。

        string[] dirs = Directory.GetDirectories(getDir());
        
        foreach (string dir in dirs) 
        {
           if (!dir.Contains("AutomaticRecepes") &&
               !dir.Contains("SpecialRecepes")) 
           {
              Directory.Delete(dir, true);
           }
        }
        

        就像一位智者曾经说过的那样:“200 行明显的代码胜过 10 行‘聪明’的代码”:)

        【讨论】:

          【解决方案6】:

          你可以做的是

          List<string> FileNames = dir.Where(x => !x.Contains("AutomaticRecepes") && !x.Contains("SpecialRecepes")).ToList();
          
          FileNames.ForEach(x => Directory.Delete(x, true));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-09-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-12-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多