如何删除除某些文件夹以外的所有文件夹

时间:2018-06-15 09:43:59

标签: c# linq foreach

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

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'类型的操作数

我该怎么做?

谢谢

6 个答案:

答案 0 :(得分:2)

您必须将条件更改为:

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

试试这个:

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);
}

答案 3 :(得分:1)

我建议您创建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);
}

答案 4 :(得分:1)

该陈述的复杂性使其难以阅读并且似乎让您感到困惑。我建议将它分解为多个单独的语句,使其更具可读性。

UPDATE Entity
SET createdDate = DATEADD(SECOND, 1, (SELECT em.createdDate FROM Entity em WHERE em.EntityID = (EntityID - 1)))
WHERE createdDate IS NULL;

就像一个聪明人曾经说过的那样:“200行显而易见的代码击败10行'聪明'代码”:)

答案 5 :(得分:0)

你可以做的是

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

FileNames.ForEach(x => Directory.Delete(x, true));