C#中DirectoryInfo.GetFiles使用注意事项
在一个文件夹内搜索指定格式的所有文件是一个十分常用的操作,通常使用DirectoryInfo.GetFiles 的方法。
在.NET Framework中,它有三个重载:
(1)GetFiles():返回当前目录下所有文件,不包括文件夹;
(2)GetFiles (string searchPattern):返回当前目录下与搜索字符串匹配的所有文件,不包括文件夹;
(3)GetFiles (string searchPattern, SearchOption searchOption):返回当前目录(或包括子目录)下与搜索字符串匹配的所有文件;
在.NET中,它有四个重载,多了一个:
(4)GetFiles(String, EnumerationOptions):返回当前目录下与搜索字符串、枚举类型(文件大小 、是否包括子目录等)匹配的所有文件,不包括文件夹。
但在应用过程中需要注意以下问题:
一、模糊搜索
搜索字符串searchPattern支持*(零个或多个字符)和?(零个或一个字符)两种通配符,但不支持正则表达式,也不支持类似"*.txt|*.xls"这样的过滤器,多个格式过滤使用以下方式实现:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | static void Test1() { Console.WriteLine( "多格式搜索1:" ); var files1 = new DirectoryInfo( @"D:\搜索测试\Data" ).GetFiles( "*.xls" ); var files2 = new DirectoryInfo( @"D:\搜索测试\Data" ).GetFiles( "*.txt" ); var files = files1.Union(files2); foreach ( var file in files) { Console.WriteLine(file); } Console.WriteLine(); } static void Test2() { Console.WriteLine( "多格式搜索2:" ); var allFiles = new DirectoryInfo( @"D:\搜索测试\Data" ).GetFiles( "*.*" ); var files = allFiles.Where(s => s.FullName.EndsWith( ".xls" ) || s.FullName.EndsWith( ".txt" )).ToList(); foreach ( var file in files) { Console.WriteLine(file); } Console.WriteLine(); } |
二、格式过滤
使用通配符过滤的,要注意官网做了如下解释:
文件扩展名正好为三个字符的 将返回扩展名为三个或多个字符的文件,其中前三个字符与 中指定的文件 searchPattern 扩展名匹配 searchPattern 。 searchPattern文件扩展名为 1、2 或 3 以上字符的 仅返回扩展名与 中指定的文件扩展名完全匹配的文件 searchPattern。
以下列表显示了 参数的不同长度 searchPattern 的行为:
"*.abc"返回扩展名为.abc、.abcd、.abcde、.abcdef 等的文件。
"*.abcd"仅返回扩展名为.abcd 的文件。
"*.abcde"仅返回扩展名为.abcde 的文件。
"*.abcdef"仅返回扩展名为.abcdef 的文件。
但实际测试结果,部分电脑是这样的,但部分电脑不是这样的,暂不清楚原因。
1 2 3 4 5 6 7 8 9 10 | static void Test3() { Console.WriteLine( "格式过滤:" ); var files = new DirectoryInfo( @"D:\搜索测试\Data" ).GetFiles( "*.xls" ); foreach ( var file in files) { Console.WriteLine(file.FullName); } Console.WriteLine(); } |
三、搜索效率
GetFiles比EnumerateFiles慢得多,尤其是大数据量下很明显。这是因为GetFiles要创建大量FileInfo对象非常耗时。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | static void Test4() { Console.WriteLine( "搜索效率:" ); var files = new DirectoryInfo( @"D:\搜索测试\Data" ) .EnumerateFiles() .AsParallel() .Where(s=> s.FullName.EndsWith( ".xls" )) .ToList(); foreach ( var file in files) { Console.WriteLine(file.FullName); } Console.WriteLine(); } |
也可尝试使用AsParallel并行、Win32函数FindNextFile来优化和提高查询速度。
参考资料
DirectoryInfo.GetFiles 方法 (System.IO) | Microsoft Learn
c# - Improve the performance for enumerating files and folders using .NET - Stack Overflow
作者:我也是个傻瓜
出处:http://www.cnblogs.com/liweis/
签名:成熟是一种明亮而不刺眼的光辉。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2015-01-05 Singular value encountered in calculation for ROI