*(00)*

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  613 随笔 :: 0 文章 :: 45 评论 :: 159万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

来源:https://www.cnblogs.com/huhangfei/p/5012978.html

诚然可以使用现成的Directory类下的GetFiles、GetDirectories、GetFileSystemEntries这几个方法实现同样的功能,但请相信我不是蛋疼,原因是这几个方法在遇上【System Volume Information】这种目录时,极有可能会给你个拒绝访问的异常,想跳过都不行。所以没办法,重新实现了一下。 实现说明 - 仍然是基于对Directory类的几个方法的封装进行实现,只是没有使用它们的searchPattern和searchOption功能 - 将匹配模式由windows的通配符?、*改为正则匹配。一是让匹配更强大,二是要实现?*匹配还得做额外工作,没必要 匹配模式并没有默认添加首尾限定^$,即“abc"将会匹配所有包含该字串的项目,所以如果你要匹配首尾,请自行添加^$ 忽略大小写匹配 如果不想搜索指定项目而是全部,请将regexPattern参数设为null,而不是.*,前者性能更好 - 可通过设置recurse和throwEx参数决定是否递归搜索,和是否抛异常。默认是不递归,不抛异常 - 遇到不可访问的目录会跳过。当然前提是throwEx=false - 之所以在foreach外层再套一层try-catch,是因为如果指定的dir就是不可访问的目录,那也可以避免异常 - 之所以为获取项、获取文件、获取目录分别实现3个方法,而不是只实现一个获取项,另外两个重载,是因为只实现一个的话,foreach中要做的逻辑判断不少,考虑到方法是要递归的,所以循环中逻辑越少越好 - 之所以不做dir参数合法性检查,原因同上,判断越少越好。所以请用户调用前自行确保dir合法 不废话,上代码:

复制代码
 1 /// <summary>
 2     /// 获取指定目录中的匹配项(文件或目录)
 3     /// </summary>
 4     /// <param name="dir">要搜索的目录</param>
 5     /// <param name="regexPattern">项名模式(正则)。null表示忽略模式匹配,返回所有项</param>
 6     /// <param name="recurse">是否搜索子目录</param>
 7     /// <param name="throwEx">是否抛异常</param>
 8     /// <returns></returns>
 9     public static string[] GetFileSystemEntries(string dir, string regexPattern, bool recurse, bool throwEx)
10     {
11         List<string> lst = new List<string>();
12 
13         try
14         {
15             foreach (string item in Directory.GetFileSystemEntries(dir))
16             {
17                 try
18                 {
19                     if (regexPattern == null || Regex.IsMatch(Path.GetFileName(item), regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline))
20                     { lst.Add(item); }
21 
22                     //递归
23                     if (recurse && (File.GetAttributes(item) & FileAttributes.Directory) == FileAttributes.Directory)
24                     { lst.AddRange(GetFileSystemEntries(item, regexPattern, recurse, throwEx)); }
25                 }
26                 catch { if (throwEx) { throw; } }
27             }
28         }
29         catch { if (throwEx) { throw; } }
30 
31         return lst.ToArray();
32     }
33 
34     /// <summary>
35     /// 获取指定目录中的匹配文件
36     /// </summary>
37     /// <param name="dir">要搜索的目录</param>
38     /// <param name="regexPattern">文件名模式(正则)。null表示忽略模式匹配,返回所有文件</param>
39     /// <param name="recurse">是否搜索子目录</param>
40     /// <param name="throwEx">是否抛异常</param>
41     /// <returns></returns>
42     public static string[] GetFiles(string dir, string regexPattern, bool recurse, bool throwEx)
43     {
44         List<string> lst = new List<string>();
45 
46         try
47         {
48             foreach (string item in Directory.GetFileSystemEntries(dir))
49             {
50                 try
51                 {
52                     bool isFile = (File.GetAttributes(item) & FileAttributes.Directory) != FileAttributes.Directory;
53 
54                     if (isFile && (regexPattern == null || Regex.IsMatch(Path.GetFileName(item), regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline)))
55                     { lst.Add(item); }
56 
57                     //递归
58                     if (recurse && !isFile) { lst.AddRange(GetFiles(item, regexPattern, recurse, throwEx)); }
59                 }
60                 catch { if (throwEx) { throw; } }
61             }
62         }
63         catch { if (throwEx) { throw; } }
64 
65         return lst.ToArray();
66     }
67 
68     /// <summary>
69     /// 获取指定目录中的匹配目录
70     /// </summary>
71     /// <param name="dir">要搜索的目录</param>
72     /// <param name="regexPattern">目录名模式(正则)。null表示忽略模式匹配,返回所有目录</param>
73     /// <param name="recurse">是否搜索子目录</param>
74     /// <param name="throwEx">是否抛异常</param>
75     /// <returns></returns>
76     public static string[] GetDirectories(string dir, string regexPattern, bool recurse, bool throwEx)
77     {
78         List<string> lst = new List<string>();
79 
80         try
81         {
82             foreach (string item in Directory.GetDirectories(dir))
83             {
84                 try
85                 {
86                     if (regexPattern == null || Regex.IsMatch(Path.GetFileName(item), regexPattern, RegexOptions.IgnoreCase | RegexOptions.Multiline))
87                     { lst.Add(item); }
88 
89                     //递归
90                     if (recurse) { lst.AddRange(GetDirectories(item, regexPattern, recurse, throwEx)); }
91                 }
92                 catch { if (throwEx) { throw; } }
93             }
94         }
95         catch { if (throwEx) { throw; } }
96 
97         return lst.ToArray();
98     }
复制代码

 

 
 
posted on   *(00)*  阅读(2056)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
历史上的今天:
2015-11-16 Windows 7无线网卡启用wifi共享蓝屏!
点击右上角即可分享
微信分享提示