我想要一个文件夹中所有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")))
但对我来说似乎有点奇怪,因为我基本上必须两次搜索相同的东西。有没有办法直接获得正确的文件或我做错了什么?
答案 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上,可能会禁用短文件名。因此,新系统上的行为实际上将是您所期望的,以及它本来应该是什么样的。