【问题标题】:How to scan a directory with wildcard with a specific subdirectory如何使用通配符扫描具有特定子目录的目录
【发布时间】:2012-11-28 17:29:44
【问题描述】:

我想知道什么是扫描包含您不确定的字符的目录的好方法。

比如我要扫描

C:\Program\Version2.*\Files

意义

  • 文件夹位于C:\Program
  • Version2.* 可以是 Version2.33Version2.1 等。
  • 该文件夹中有一个名为 Files 的文件夹

我知道我可以做类似foreach (directory) if contains("Version2.") 的事情,但我想知道是否有更好的方法。

【问题讨论】:

  • 你试过Directory.GetFiles function吗?我不确定这是否会包含多个目录,但它有 * 作为通配符
  • @Default,这个答案很有用,当通配符在路径的末尾时,而不是在这个问题的中间。
  • @AlexeiLevenkov 你是对的,在我建议“重复”之后我注意到了这个细节:)

标签: c# search directory wildcard


【解决方案1】:

Directory.EnumerateDirectories 接受搜索模式。因此,枚举具有通配符的父级,而不是枚举其余的:

  var directories = 
    Directory.EnumerateDirectories(@"C:\Program\", "Version2.*")
     .SelectMany(parent => Directory.EnumerateDirectories(parent,"Files"))

注意:如果路径可以包含任何级别的通配符 - 只需标准化路径并用“\”分割,而不是逐级收集文件夹。

【讨论】:

  • 是否有理由使用 EnumerateDirectories 而不是 GetDirectories?
  • @Default EnumerateDirectories 使用惰性求值,因此对于大量文件/文件夹可能更快(查看 MSDN link 的备注部分)
  • 这似乎最适合我目前正在寻找的(:我会尽快尝试。谢谢!
【解决方案2】:

试试这个

var pattern = new Regex(@"C:\\Program\\Version 2(.*)\\Files(.*)");

var directories = Directory.EnumerateDirectories(@"C:\Program", "*", 
                                                 SearchOption.AllDirectories)
                                                .Where(d => pattern.IsMatch(d));

【讨论】:

  • +1。可能有效,但可能会找到更多目录 - 稍后需要额外过滤。
猜你喜欢
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
  • 2013-10-26
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多