如何过滤具有特定扩展名的Directory.EnumerateFiles

时间:2016-03-21 15:38:33

标签: c# .net directory file-extension

我想要一个文件夹中所有xml文件的列表,如下所示:

foreach (var file in Directory.EnumerateFiles(folderPath, "*.xml"))
{
    // add file to a collection
}

但是,如果我出于某种原因,folderPath中的任何文件以.xmlXXX结尾,其中XXX代表任何字符,那么它们将成为枚举器的一部分。

如果可以通过执行类似

的操作轻松解决问题
foreach (var file in Directory.EnumerateFiles(folderPath, "*.xml").Where(x => x.EndsWith(".xml")))

但对我来说似乎有点奇怪,因为我基本上必须两次搜索相同的东西。有没有办法直接获得正确的文件或我做错了什么?

3 个答案:

答案 0 :(得分:3)

带文件搜索的通配符用法的记录/默认行为。

Directory.EnumerateFiles Method (String, String)

  

如果指定的扩展名正好是三个字符长,那么   方法返回扩展名以指定开头的文件   延期。例如," * .xls"返回" book.xls"和   " book.xlsx"

您当前的过滤方法是正确的方法。

您可以做的唯一改进是忽略EndsWith中的案例:

x.EndsWith(".xml", StringComparison.CurrentCultureIgnoreCase)

答案 1 :(得分:1)

根据MSDN

,您似乎无法使用EnumerateFiles进行3个字符的扩展

引用上面的文章

  

在searchPattern中使用星号通配符(例如" .txt")时,指定扩展名中的字符数会影响搜索,如下所示:   如果指定的扩展名正好是三个字符长,则该方法返回扩展名以指定扩展名开头的文件。例如," .xls"返回" book.xls"和#34; book.xlsx"。   在所有其他情况下,该方法返回与指定扩展名完全匹配的文件。例如," .ai"返回" file.ai"但不是" file.aif"。   使用问号通配符时,此方法仅返回与指定文件扩展名匹配的文件。例如,给定两个文件," file1.txt"和" file1.txtother",在目录中,"文件的搜索模式?.txt"只返回第一个文件,而搜索模式为"文件 .txt"返回两个文件。

因此,使用.Where扩展名似乎是解决问题的最佳方法

答案 2 :(得分:0)

是的,这个设计是愚蠢的,愚蠢的,愚蠢的!它不应该这样做。而且它也很烦人!

那就是说,这似乎正在发生的事情:它实际上搜索了长文件名和短文件名。因此,扩展名较长的文件将具有短文件名,扩展名将截断为三个字符。

在较新版本的Windows上,可能会禁用短文件名。因此,新系统上的行为实际上将是您所期望的,以及它本来应该是什么样的。