如何从使用通配符

时间:2016-01-13 19:48:40

标签: c#

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

但是在我的情况下,我想从名为' data'的每个文件夹中获取所有文件。这是我目录中所有文件夹的第一个子项。

假设我需要的是以下内容:

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

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

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

  

我可以通过多次调用GetDirectories和GetFiles来实现此目的   循环,但我宁愿找到更多   优雅的解决方(即我想避免的::获取所有目录   在我的目录\ Share下,循环并为每个文件添加get文件   那些数据目录,将所有这些集合成一个列表   我的文件名的字符串等...)

编辑 - 解决方案:: 实际上@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();

感谢您的帮助!

1 个答案:

答案 0 :(得分: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将返回这些文件夹中的所有文件。