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

本文关键字:列表 searchPattern 范围 EnumerateFiles Directory | 更新日期: 2023-09-27 18:25:19

给定如下文件列表:

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

如有任何帮助,我们将不胜感激。

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

建立在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)));
}

资源

Directory.EnumerateFiles似乎只能使用简单的通配符。然而,根据这个问题/答案(如何在C#中根据RegEx查找文件)。您可以使用LINQ和正则表达式匹配来进行过滤吗?

将其与LINQ:结合使用

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