【问题标题】:Exclude subdirectories in a directory loop在目录循环中排除子目录
【发布时间】:2012-10-20 20:30:31
【问题描述】:

在 .NET 代码中,我有一个循环,它从 D:\Temp 及其子目录中获取所有 .wav 文件:

string[] fileHolder = Directory.GetFiles("D:\\Temp","*.wav", SearchOption.AllDirectories);

我想排除所有来自文件夹名称中包含“blablabla”的文件夹的 .wav 文件。

如何做到这一点?

附:这个类似于Exclude directories that contain sub directories?,但是我一直没能成功使用这个话题的答案。

【问题讨论】:

  • 看起来链接问题中的所有内容。将答案应用于您想要实现的目标到底有什么问题?

标签: c# .net subdirectory


【解决方案1】:
IEnumerable<string> files = 
   from f in Directory.GetFiles("D:\\Temp", "*.wav", SearchOption.AllDirectories)
   where !Path.GetDirectoryName(f).Contains("blablabla")
   select f;

添加几个条件:

var files = from f in Directory.GetFiles("D:\\Temp", "*.wav", SearchOption.AllDirectories)
            let directoryName = Path.GetDirectoryName(f)
            where !directoryName.Contains("blablabla") &&
                  !direcotyName.Contains("foo")
            select f;

另一种解决方案:(我认为 Path.GetDirectoryName 不是最快的操作)

public static IEnumerable<string> GetFiles(string path, string searchPattern,
                                           Func<string, bool> dirSelector)
{
    if (!dirSelector(path))
        yield break;

    foreach (var file in Directory.GetFiles(path, searchPattern))
        yield return file;

    foreach (var dir in Directory.GetDirectories(path))
        foreach (var file in GetFiles(dir, searchPattern, dirSelector))
            yield return file;
}

用法:

Func<string, bool> dirSelector = (d) => !d.Contains("blablabla");
string[] files = GetFiles("D:\\Temp", "*.wav", dirSelector).ToArray();

【讨论】:

  • 这是在 C# 中(带有“var”等)吗?抱歉,我对 C#、.net 不太了解?
  • 使用这个解决方案,是否也可以排除 3 个不同的单词?排除 blablabla1,排除 blablabla2,排除 blablabla3:如何编码?
  • 感谢lazyberezovsky!在 C# 中也可以使用“var”吗?对多重排除有什么想法吗?
  • 3个ifs后最好使用HashSet&lt;T&gt;.Contains(x)
  • @JosBas var 在 C# 3.0 及更高版本中可用
【解决方案2】:

尝试以下操作:

string[] fileHolder = Directory.GetFiles(@"d:\temp", "*.wav",
         SearchOption.AllDirectories).Where(file => !file.Contains("blabla")).ToArray();

【讨论】:

  • +1 但如果搜索到的文本在文件名中而不是在文件夹名中,则该文件将被排除
  • 我认为这个查询也会过滤名称中包含blabla 的文件。
  • 你说得对,谢谢.. Path.GetDirectoryNameRegex 将需要.. 取决于情况
  • 这是否正确(如果我只想过滤文件夹名称):string[] fileHolder = Directory.GetFiles(@"d:\temp", "*.wav", SearchOption.AllDirectories).Where(file =&gt; !Path.GetDirectoryName(file).Contains("blabla")).ToArray();
  • 最后一个问题:如何排除文件夹名称包含“blablabla1”或“blablabla2”或“blablabla3”的文件(我只有 3 个要排除的名称)
【解决方案3】:

您必须手动整理它们:

List<string> result = new List<string>();
foreach(string filename in Directory.GetFiles("D:\\Temp", "*.wav"))
{
   if (!filename.Contains("blablabla"))
      result.Add(filename);
}

【讨论】:

  • 这个也不错。如何在所有这些解决方案中进行选择? :)
猜你喜欢
  • 1970-01-01
  • 2021-09-22
  • 2019-01-22
  • 2016-03-24
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
相关资源
最近更新 更多