Directory.EnumerateFiles:如何将范围或列表指定为searchPattern

时间:2013-07-29 17:54:14

标签: c# .net

给出这样的文件列表:

file_1.txt
file_2.txt
file_3.txt
file_4.txt
file_5.txt
file_6.txt

如何调用Directory.EnumerateFiles()来获取范围或文件列表?例如

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_*.txt", SearchOption.TopDirectoryOnly)

会返回上面的所有六个文件,到目前为止一切都很好。但是,如果我想获得范围(即从file_3.txtfile_5.txt)或列表(即file_1.txtfile_4.txtfile_6.txt),该怎么办?

我正在寻找的是这样的(下面的代码不起作用......只是为了给你一个想法):

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_{3-5}.txt", SearchOption.TopDirectoryOnly)

获取一系列文件

file_3.txt
file_4.txt
file_5.txt

......然后

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_{1,4,6}.txt", SearchOption.TopDirectoryOnly)

获取精确的文件列表

file_1.txt
file_4.txt
file_6.txt

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:1)

Directory.EnumerateFiles似乎只适用于简单的通配符。但是,根据这个问题/答案(How to find files according RegEx in C#)。您可以使用LINQ和正则表达式匹配来进行过滤吗?

答案 1 :(得分:1)

将它与LINQ结合使用:

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_*.txt").Skip(2).Take(3);

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_*.txt").Where(...);

答案 2 :(得分:1)

以DavidH的答案为基础。

使用LINQ和System.Text.Regular表达式获取文件列表:

IEnumerable<string> files1to3 =  Directory.EnumerateFiles(@"C:\", "File*.txt", SearchOption.TopDirectoryOnly).Where(f => Regex.IsMatch(f, "File[1-3].txt"));
IEnumerable<string> files4to6 = Directory.EnumerateFiles(@"C:\", "File*.txt", SearchOption.TopDirectoryOnly).Where(f => Regex.IsMatch(f, "File[4,5,6].txt"));

回应@ j3d:

IEnumerable<string> files150to200 = Directory.EnumerateFiles(@"C:\", "File*.txt", SearchOption.TopDirectoryOnly).Where(f => Convert.ToInt32(Regex.Match(f, @"\d+").Value) >= 150 && Convert.ToInt32(Regex.Match(f, @"\d+").Value) <= 200);

对于文件编号列表,您可以执行以下操作:

System.Collections.ArrayList searchArrayList = new System.Collections.ArrayList();
searchArrayList.Add(new int[] { 1, 125, 1554 });

foreach (int[] i in searchArrayList) {
    IEnumerable<string> findFiles = Directory.EnumerateFiles(@"c:\", "File*.txt", SearchOption.TopDirectoryOnly).Where(f => i.Contains(Convert.ToInt32(Regex.Match(f, @"\d+").Value)));
}

Resource