我在Stack Overflow上找到了几个关于Directory.GetFiles()的问题,但在所有情况下,他们都解释了如何使用它来通过多个条件查找特定扩展或一组文件。但在我的情况下,我想要的是使用正则表达式获取Directory.GetFiles()的搜索模式,正则表达式返回目录的所有文件,但是我指定的集合。我的意思是不要声明我想要的那套但是差别。例如,如果我想要目录的所有文件而不是htmls。请注意,我知道它可以通过这种方式实现它:
var filteredFiles = Directory
.GetFiles(path, "*.*")
.Where(file => !file.ToLower().EndsWith("html")))
.ToList();
但这不是一个非常可重复使用的解决方案,如果以后我想过滤另一种文件我必须更改代码添加一个||到何处。我正在寻找允许我创建正则表达式的东西,其中包含我不想获取的文件并将其传递给Directory.GetFiles()。因此,如果我想稍后过滤更多扩展,只需更改正则表达式。
答案 0 :(得分:7)
如果要过滤扩展程序,则不需要正则表达式:
// for example a field or property in your class
private HashSet<string> ExtensionBlacklist { get; } =
new HashSet<string>(StringComparer.InvariantCultureIgnoreCase)
{
".html",
".htm"
};
// ...
var filteredFiles = Directory.EnumerateFiles(path, "*.*")
.Where(fn => !ExtensionBlacklist.Contains(System.IO.Path.GetExtension(fn)))
.ToList();
答案 1 :(得分:1)
我建议不要使用正则表达式来支持这样的事情:
var filteredFiles = Directory
.GetFiles(path, "*.*")
.Where(file => !excludedExtensions.Any<string>((extension) =>
file.EndsWith(extension, StringComparison.CurrentCultureIgnoreCase)))
.ToList();
您可以向其传递一系列已排除的扩展名,例如:
var excludedExtensions = new List<string>(new[] {".html", ".xml"});
Any
一旦在排除的扩展名上找到匹配项就会短路,所以我认为这对excludedExtensions.Contains()
更为可取。至于正则表达式,我不认为有一个很好的理由使用它,因为它可以给你带来麻烦。不要使用正则表达式,除非它是唯一的工具。
答案 2 :(得分:0)
基本上你只是不知道如何在字符串上执行正则表达式匹配?
出于这个目的,有Regex.IsMatch。但是,您也可以更改代码以在一组扩展中查找扩展名以进行过滤,这也可以让您轻松添加新过滤器。