在EnumerateFiles中配置SearchPattern

时间:2012-05-30 07:56:04

标签: c# .net c#-4.0 directoryinfo

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

  • file1.xls
  • file2.xlsx

如果我这样做:

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

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

谢谢!

5 个答案:

答案 0 :(得分:10)

看起来很糟糕,DirectoryInfo类使用Win32调用FindFirstFile

这只允许使用通配符:

*匹配任何字符

?匹配0个或更多字符 - 请参阅comments

因此,您必须自己过滤结果,可能使用以下内容:

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

答案 1 :(得分:3)

这实际上是预期的行为。这很奇怪,但记录在案。

MSDN,我们可以阅读一条评论:

  

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

这样的事情:

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

答案 4 :(得分:0)

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

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

您可以使用联盟添加更多扩展程序。总体而言,这更清洁(我相信它更快,但没有经过测试)。 IMO