如果我想调用Directory.GetFiles并让它返回与模式*.bin
匹配的所有文件,但我想排除所有匹配模式LOG#.bin
的文件#
GetFiles
1}}是一个不确定长度的运行计数器。有没有办法在将搜索过滤器传递给{{1}}的步骤中过滤掉结果,或者我必须获取结果数组然后删除我要排除的项目吗?
答案 0 :(得分:8)
您可以使用Linq,Directory.EnumerateFiles()
和Where()
过滤器 - 这样您只能获得所需的文件,其余文件将被过滤掉。
这样的事情应该有效:
Regex re = new Regex(@"^LOG\d+.bin$");
var logFiles = Directory.EnumerateFiles(somePath, "*.bin")
.Where(f => !re.IsMatch(Path.GetFileName(f)))
.ToList();
正如所指出的那样Directory.EnumerateFiles
需要.NET 4.0。另外一个更清洁的解决方案(以更多的开销为代价)使用DirectoryInfo
/ EnumerateFiles()
返回IEnumerable<FileInfo>
,这样您就可以直接访问文件名和扩展名而无需进一步操作解析。
答案 1 :(得分:2)
使用Linq有一个解决方案:
using System;
using System.IO;
using System.Linq;
namespace getfilesFilter
{
class Program
{
static void Main(string[] args)
{
var files = Directory.GetFiles(@"C:\temp", "*.bin").Select(p => Path.GetFileName(p)).Where(p => p.StartsWith("LOG"));
foreach (var file in files)
{
Console.WriteLine(file);
}
Console.ReadLine();
}
}
}