【问题标题】:How to filter Directory.EnumerateFiles with specific extension如何过滤具有特定扩展名的 Directory.EnumerateFiles
【发布时间】:2016-07-08 05:17:20
【问题描述】:

我想要一个文件夹中所有 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")))

但这对我来说似乎有点奇怪,因为我基本上必须搜索两次相同的东西。有什么方法可以直接获取正确的文件还是我做错了什么?

【问题讨论】:

    标签: c# .net directory file-extension


    【解决方案1】:

    根据MSDN,您似乎无法使用 EnumerateFiles 进行 3 个字符扩展名

    引用上面的文章

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

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

    【讨论】:

      【解决方案2】:

      这是文件搜索中通配符使用的记录/默认行为。

      Directory.EnumerateFiles Method (String, String)

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

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

      您可以做的唯一改进是忽略@​​987654322@ 中的大小写,例如:

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

      【讨论】:

      • 为我没有正确阅读文档而感到羞耻。感谢改进
      【解决方案3】:

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

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

      在较新版本的 Windows 上,可能会禁用短文件名。因此,较新系统上的行为实际上将是您所期望的,也是最初应该是的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-23
        • 2016-01-06
        • 1970-01-01
        • 2010-12-16
        • 2020-06-06
        • 2011-02-14
        相关资源
        最近更新 更多