枚举文件中的配置搜索模式

本文关键字:搜索 模式 配置 文件 枚举 | 更新日期: 2023-09-27 18:35:55

>我有一个包含 2 个文件的目录:

  • 文件1.xls
  • 文件2.xlsx

如果我这样做:

directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)

它返回两个文件,我只想要第一个(file1.xls)。我该怎么做?

谢谢!

枚举文件中的配置搜索模式

看起来在引擎盖下,DirectoryInfo类使用 Win32 调用FindFirstFile

这只允许通配符:

*匹配任何字符

?匹配 0 个或多个字符 - 请参阅注释。

因此,您必须自己过滤结果,也许使用以下方法:

directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
             .Where(fi => fi.Extension == ".xls");

这实际上是一种预期的行为。这很奇怪,但它是有据可查的。

在MSDN上,我们可以读到一个评论:

在 searchPattern 中使用星号通配符(如"*.txt")时,扩展名长度正好为三个字符时的匹配行为与扩展名长度大于或小于三个字符时的匹配行为不同。文件扩展名正好为三个字符的搜索模式返回扩展名为三个或更多字符的文件,其中前三个字符与搜索模式中指定的文件扩展名匹配。文件扩展名为 1、2 或 3 个字符以上的 searchPattern 仅返回扩展名长度与 searchPattern 中指定的文件扩展名完全匹配的文件。使用问号通配符时,此方法仅返回与指定文件扩展名匹配的文件。例如,给定两个文件,"file1.txt"和"file1.txtother",在一个目录中,搜索模式为"file?"。txt"仅返回第一个文件,而"file*.txt"的搜索模式返回两个文件。

像这样:

directoryInfo.EnumerateFiles(".xls",SearchOption.TopDirectoryOnly)
    .Where( f => Path.GetExtension( f ) == ".xls" );
你可以

使用IEnumerable.First()IEnumerable.FirstOrDefault()扩展方法,或者,如果模式很重要,请更正枚举搜索模式。

这使用 .Except() 并且应该更快:

   var dir = new DirectoryInfo(myFolderPath);
   ICollection<FileInfo> files = dir.EnumerateFiles("*.xls").Except(dir.EnumerateFiles("*.xls?")).ToList();

您可以使用联合添加更多扩展。总的来说,这更干净(我相信它更快,尽管没有测试过)。国际 海事 组织