7

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

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

如果我做:

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

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

谢谢!

4

5 回答 5

10

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

这只允许通配符:

*匹配任何字符

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

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

directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
             .Where(fi => fi.Extension == ".xls");
于 2012-05-30T08:31:25.190 回答
3

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

MSDN上我们可以读到一句话:

在 searchPattern 中使用星号通配符(例如“*.txt”)时,扩展名正好是三个字符长时的匹配行为与扩展名长度多于或少于三个字符时的匹配行为不同。文件扩展名正好为三个字符的 searchPattern 返回具有三个或更多字符扩展名的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。具有一个、两个或三个以上字符的文件扩展名的 searchPattern 仅返回具有与 searchPattern 中指定的文件扩展名完全匹配的扩展名的文件。使用问号通配符时,此方法仅返回与指定文件扩展名匹配的文件。例如,给定两个文件,“file1.txt”和“file1.txt”。

于 2014-01-17T15:27:23.993 回答
0

像这样的东西:

directoryInfo.EnumerateFiles(".xls",SearchOption.TopDirectoryOnly)
    .Where( f => Path.GetExtension( f ) == ".xls" );
于 2012-05-30T08:23:09.913 回答
0

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

于 2012-05-30T08:13:00.377 回答
0

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

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

您可以使用 Union(s) 添加更多扩展。总体而言,这更清洁(我相信它更快,尽管尚未测试)。国际海事组织

于 2018-03-15T02:02:02.763 回答