0

给定这样的文件列表:

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)

将返回上述所有六个文件,到目前为止一切顺利。但是如果我想得到一个范围(即 from file_3.txtto file_5.txt)或一个列表(即file_1.txt, file_4.txtand file_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

任何帮助,将不胜感激。

4

3 回答 3

1

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

于 2013-07-29T17:59:41.300 回答
1

将其与 LINQ 结合:

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

Directory.EnumerateFiles(Directory.GetCurrentDirectory(), "file_*.txt").Where(...);
于 2013-07-29T18:00:33.810 回答
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)));
}

资源

于 2013-07-29T18:24:23.313 回答