使用Directory.GetFiles()选择除特定扩展名之外的所有文件

本文关键字:扩展名 文件 GetFiles Directory 选择 使用 | 更新日期: 2023-09-27 17:58:14

我在Stack Overflow上发现了几个关于Directory.GetFiles()的问题,但在所有情况下,他们都解释了如何使用它通过多个标准查找特定的扩展名或一组文件。但在我的例子中,我想要的是使用正则表达式获得Directory.GetFiles()的搜索模式,它返回目录中的所有文件,但返回我指定的集合。我的意思是不声明我想要的集合,而是声明差异。例如,如果我想要一个目录的所有文件,但不想要htmls。注意,我知道它可以通过这种方式实现:

var filteredFiles = Directory
.GetFiles(path, "*.*")
.Where(file => !file.ToLower().EndsWith("html")))
.ToList();

但这不是一个非常可重用的解决方案,如果以后我想筛选另一种类型的文件,我必须更改代码,在Where条件中添加一个||。我正在寻找一种可以让我创建regex的东西,它包含在我不想获取的文件中,并将其传递给Directory.GetFiles()。因此,如果我想稍后筛选更多扩展名,只需更改regex即可。

使用Directory.GetFiles()选择除特定扩展名之外的所有文件

如果要筛选扩展名,则不需要正则表达式:

// 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();

我建议不要使用regex来支持这样的东西:

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()更可取。至于regex,我认为没有充分的理由使用它,因为它会给你带来麻烦。不要使用regex,除非它是作业的唯一工具。

所以本质上你只是不知道如何对字符串执行正则表达式匹配?

Regex.IsMatch正是为了这个目的。但是,您也可以更改代码以在一组要筛选的扩展中查找扩展,这也允许您轻松添加新的筛选器。