【发布时间】:2012-06-04 10:43:43
【问题描述】:
我有一个包含 2 个文件的目录:
- file1.xls
- file2.xlsx
如果我这样做:
directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
它返回两个文件,我只想要第一个(file1.xls)。我该怎么做?
谢谢!
【问题讨论】:
标签: c# .net c#-4.0 directoryinfo
我有一个包含 2 个文件的目录:
如果我这样做:
directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
它返回两个文件,我只想要第一个(file1.xls)。我该怎么做?
谢谢!
【问题讨论】:
标签: c# .net c#-4.0 directoryinfo
这可以使用 .Except() 并且应该更快:
var dir = new DirectoryInfo(myFolderPath);
ICollection<FileInfo> files = dir.EnumerateFiles("*.xls").Except(dir.EnumerateFiles("*.xls?")).ToList();
您可以使用 Union(s) 添加更多扩展。总体而言,这更清洁(我相信它更快,尽管尚未测试)。海事组织
【讨论】:
看起来,DirectoryInfo 类使用 Win32 调用 FindFirstFile。
这仅允许通配符:
* 匹配任意字符
? 匹配 0 个或多个字符 - 请参阅 comments。
因此,您必须自己过滤结果,可能使用以下方法:
directoryInfo.EnumerateFiles("*.xls", SearchOption.TopDirectoryOnly)
.Where(fi => fi.Extension == ".xls");
【讨论】:
这实际上是一种预期的行为。这很奇怪,但它已被记录在案。
在MSDN上我们可以读到一句话:
在 searchPattern 中使用星号通配符(例如“*.txt”)时,扩展名正好是三个字符时的匹配行为与扩展名长度多于或少于三个字符时的匹配行为不同。文件扩展名正好为三个字符的 searchPattern 返回具有三个或更多字符扩展名的文件,其中前三个字符与 searchPattern 中指定的文件扩展名匹配。具有一个、两个或三个以上字符的文件扩展名的 searchPattern 仅返回具有与 searchPattern 中指定的文件扩展名完全匹配的扩展名的文件。使用问号通配符时,此方法仅返回与指定文件扩展名匹配的文件。例如,给定目录中的两个文件“file1.txt”和“file1.txtother”,“file?.txt”的搜索模式只返回第一个文件,而“file*.txt”的搜索模式返回两个文件。
【讨论】:
您可以使用IEnumerable.First()、IEnumerable.FirstOrDefault() 扩展方法,
或者如果模式很重要,请更正您的枚举搜索模式。
【讨论】:
类似这样的:
directoryInfo.EnumerateFiles(".xls",SearchOption.TopDirectoryOnly)
.Where( f => Path.GetExtension( f ) == ".xls" );
【讨论】: