如何使用通配符扫描带有特定子目录的目录

7

我在想有没有一种好的方法来扫描一个包含你不确定字符的目录。

例如,我想扫描

C:\Program\Version2.*\Files

意思是:

  • 该文件夹位于 C:\Program
  • Version2.* 可以是任何东西,比如 Version2.33Version2.1 等等
  • 该文件夹中有一个名为 Files 的文件夹

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


你是否尝试过 Directory.GetFiles 函数?我不确定它是否包括多个目录,但它有*通配符。 - default
可能是重复问题:https://dev59.com/hWw05IYBdhLWcg3wXAqF - default
@Default,那个答案很有用,但是它针对的是路径末尾的通配符,而不是像这个问题中似乎在路径中间的情况。 - Alexei Levenkov
@AlexeiLevenkov 你是对的,我在建议“重复”之后才注意到那个细节 :) - default
2个回答

8

Directory.EnumerateDirectories 接受搜索模式。因此,首先枚举具有通配符的父级,然后枚举其余部分:

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

注意:如果路径可以在任何级别上包含通配符 - 只需将路径规范化并按“\”分隔,然后逐级收集文件夹。

使用EnumerateDirectories而不是GetDirectories有什么原因吗? - default
2
@Default EnumerateDirectories 使用惰性求值,因此在处理大量文件/文件夹时可能更快(请查看 MSDN 链接 的备注部分) - Alexei Levenkov
这似乎是我目前正在寻找的最佳选择(: 我很快会尝试一下。谢谢! - 00101010 10101010

1

试试这个

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

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

+1. 可能会起作用,但很可能会找到更多的目录 - 需要稍后进行额外的过滤。 - Alexei Levenkov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接