博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#递归搜索指定目录下的文件或目录
阅读量:6718 次
发布时间:2019-06-25

本文共 3944 字,大约阅读时间需要 13 分钟。

来源: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 ///  2     /// 获取指定目录中的匹配项(文件或目录) 3     ///  4     /// 要搜索的目录 5     /// 项名模式(正则)。null表示忽略模式匹配,返回所有项 6     /// 是否搜索子目录 7     /// 是否抛异常 8     /// 
9 public static string[] GetFileSystemEntries(string dir, string regexPattern, bool recurse, bool throwEx)10 {11 List
lst = new List
();12 13 try14 {15 foreach (string item in Directory.GetFileSystemEntries(dir))16 {17 try18 {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 ///
35 /// 获取指定目录中的匹配文件36 /// 37 ///
要搜索的目录38 ///
文件名模式(正则)。null表示忽略模式匹配,返回所有文件39 ///
是否搜索子目录40 ///
是否抛异常41 ///
42 public static string[] GetFiles(string dir, string regexPattern, bool recurse, bool throwEx)43 {44 List
lst = new List
();45 46 try47 {48 foreach (string item in Directory.GetFileSystemEntries(dir))49 {50 try51 {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 ///
69 /// 获取指定目录中的匹配目录70 /// 71 ///
要搜索的目录72 ///
目录名模式(正则)。null表示忽略模式匹配,返回所有目录73 ///
是否搜索子目录74 ///
是否抛异常75 ///
76 public static string[] GetDirectories(string dir, string regexPattern, bool recurse, bool throwEx)77 {78 List
lst = new List
();79 80 try81 {82 foreach (string item in Directory.GetDirectories(dir))83 {84 try85 {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 }

 

 
 
你可能感兴趣的文章
从“窃听门”事件解读手机Rootkit攻击
查看>>
[Android学习笔记三] Support v7提供交错式网格布局开发示例
查看>>
QoS令牌桶工作原理
查看>>
重提URL Rewrite(4):不同级别URL Rewrite的一些细节与特点
查看>>
linux子系统的初始化_subsys_initcall()【转】
查看>>
x60系统安装步骤
查看>>
Linux内核同步机制之(三):memory barrier【转】
查看>>
安装Fedora 24后必要的设置
查看>>
ES JVM使用如果超过75%就会GC较多,导致ES索引性能下降
查看>>
elasticsearch源码分析之search模块(server端)
查看>>
【转】如何用 Chrome for Android 做远程遥控 debugging
查看>>
Rails中Form标签JavaScript验证
查看>>
ArcObject开发,程序编译通过,但无法启动的解决
查看>>
Oracle 存储过程的创建,及触发器调用存储过程
查看>>
关于Socket通信服务的心跳包(转)
查看>>
.net面试问答(大汇总)
查看>>
BST B-树 B+树 B*树简介
查看>>
21、ASP.NET MVC入门到精通——ASP.NET MVC4优化
查看>>
Arm-kernel 内存收集【转】
查看>>
HTML5之Canvas标签简要学习
查看>>