【问题标题】:How to getFiles from a directory path that uses wildcards如何从使用通配符的目录路径中获取文件
【发布时间】:2016-01-13 19:48:40
【问题描述】:

这个问题类似: Possible to specify directory path with a wildcard?

但是,就我而言,我想从每个名为“data”的文件夹中获取所有文件,该文件夹是我目录中所有文件夹的第一个子文件夹。

假设我需要以下内容:

string[] files = System.IO.Directory.GetFiles(directory + "\\Share\\*\\data");

*'directory' 只是目录路径的字符串

GetFiles 和 GetDirectories 方法都不接受通配符,我的理解是,它们必须用作过滤器作为第二个参数(这两种方法都有重载)。但是在 GetFiles 的情况下,它专门用于过滤 files 而不是目录,在 GetDirectories 的情况下,它给了我同样的错误,好像过滤器只适用于最低级别的目录(或类似的东西)。

我可以通过多次调用 GetDirectories 和 GetFiles 来做到这一点 一个循环,但我宁愿找到更多 优雅的解决方案。 (即我要避免的::获取所有目录 在我的目录\共享下,循环并添加获取每个文件的所有文件 \data 目录,将所有这些聚集到一个列表中 我的文件名等字符串...)

编辑 - 解决方案:: 实际上@Steve Wong 向我指出了我所采用的解决方案(希望正则表达式不是一个大禁忌):

Regex reg = new Regex(@"^\\" + directory + @"\\Share\\.*\\data\\.*\.xml$");

List<string> files = System.IO.Directory.GetFiles(connect + "\\Share","*.*",SearchOption.AllDirectories).Where(path => reg.IsMatch(path)).ToList();

感谢您的帮助!

【问题讨论】:

  • 我认为除了循环之外别无他法。将其提取到一个方法中并忘记它......你说它“更重”,但任何其他实现都可能做到这一点,只是你不会直接看到它。
  • 是的,你可能是对的,我问了一圈,我得出了这个结论。

标签: c#


【解决方案1】:

你可以试试这个:

string rootDirectory = directory + "\\Share\\";
var files = Directory.GetDirectories(rootDirectory, "*", SearchOption.AllDirectories).Where(
      (directoryPath) => StringComparer.OrdinalIgnoreCase.Compare(Path.GetFileName(directoryPath), "Data") == 0).SelectMany(
      (directoryPath) => Directory.GetFiles(directoryPath, "*"));

Where 子句将返回所有以“Data/data”文件夹结尾的文件夹路径,然后 SelectMany 返回这些文件夹中的所有文件。

【讨论】:

  • 我很想使用它,但是 SelectMany 会在迭代时执行操作,这意味着虽然它现在将被编码在单行上,但它仍然会遍历最初找到的目录。 (在这里我不确定,但我觉得这实际上性能较差,因为在获取所有文件 \*\* 然后返回与路径匹配的文件 \*\data)我认为@DrewJordan 就在那里无法解决这种行为 - 为了代码清晰起见,我想我只会编写 foreach 循环。不过,我确实要求提供一个更优雅的解决方案,在这方面我会给出 +1 :)
猜你喜欢
  • 1970-01-01
  • 2020-05-27
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 2010-10-15
相关资源
最近更新 更多