从Directory.GetFiles中排除结果

如果我想调用Directory.GetFiles并让它返回与模式*.bin匹配的所有文件,但我想排除所有与模式LOG#.bin匹配的文件,其中#是不确定长度的运行计数器。 有没有办法在将搜索filter传递给GetFiles的步骤中过滤掉结果,或者我必须获取结果数组然后删除我要排除的项目?

您可以使用Linq, Directory.EnumerateFiles()Where()filter – 这样您只能得到所需的文件,其余的被过滤掉。

像这样的东西应该工作:

 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因此您可以直接访问文件名和扩展名而无需进一步解析。

使用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(); } } }