C#递归搜索指定目录下的文件或目录


来源: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     }

 

 
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/454062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

solr 配置

创建 SolrHome(solrCore) 1.解压 solr-4.10.4.tgz 到 /usr/local/solr 2.将 solr-4.10.4/example/solr 下所有文件拷贝到 /usr/local/solrhome (此 solrhome 为自己创建的) solrhome 是 solr 运行主目录&#xff0c;可包含多个 SolrCore 目录SolrCore 目录中包含运行 Solr 实例…

mfc程序转化为qt_10年程序员:我都学过这些语言,2019年开始我再也不是程序员......

为什么学编程2008年&#xff0c;高中毕业的我问一个已经工作两年的亲戚&#xff1a;什么专业工资高&#xff1f;他告诉我&#xff1a;程序员。2008年成都最低工资好像是800元&#xff0c;我的生活费也是800元&#xff0c;据他所说程序员出来的工资是2000&#xff0c;于是开始了…

day 7 引用

1.ba在c语言和python中的区别 c语言&#xff1a;a100 a变量里面放的100 b a b变量里面也放的100 python &#xff1a; a100 内存中有个100 a放的100的内存地址 b a b也放的100的内存地址 相当于给100那一块内存&#xff0c;贴个便利签 2.type查看数据类型&…

Dapper逆天入门~强类型,动态类型,多映射,多返回值,增删改查+存储过程+事物案例演示...

Dapper的牛逼就不扯蛋了&#xff0c;答应群友做个入门Demo的&#xff0c;现有园友需要&#xff0c;那么公开分享一下&#xff1a; 完整Demo&#xff1a;http://pan.baidu.com/s/1i3TcEzj 注 意 事 项&#xff1a;http://www.cnblogs.com/dunitian/p/5221058.html 平台之大势何人…

Linux 状态命令之磁盘状态 iostat

Linux系统中的iostat是I/O statistics&#xff08;输入/输出统计&#xff09;的缩写&#xff0c;iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况&#xff0c;同时也会汇报出CPU使用情况。同vmstat一样&#xff0c;iostat也有一个弱点&#xff0c;就…

GDB十分钟教程

GDB十分钟教程 作者: liigo 原文链接: http://blog.csdn.net/liigo/archive/2006/01/17/582231.aspx 日期: 2006年1月16日 本文写给主要工作在Windows操作系统下而又需要开发一些跨平台软件的程序员朋友&#xff0c;以及程序爱好者。 GDB是一个由GNU开源组织发布的、UNIX/LI…

课后作业-阅读任务-阅读提问-3

1.如果两个人合作的始终达不到规范阶段该怎如何处理&#xff1f; 2. 逻辑和界面设计要注意哪些因素&#xff1f;转载于:https://www.cnblogs.com/fhycm/p/7866548.html

ride上点击用例不能显示edit信息_接口测试平台代码实现61: 多接口用例1

终于又序更上了&#xff0c;原谅最近作者几天事情不断。按照我们之前的计划&#xff0c;需要迅速开启很重要的核心多用例接口。首先&#xff0c;我们要确定&#xff0c;这个功能的大体设计。就放在在我们的页面 用例库 中&#xff1a;所以也就是我们很久之前就创建好的P_cases.…

黑客攻防专题八:21种RING的提权方法

好多都没有成功&#xff0c;还是发来看看&#xff0c;看看思路&#xff0c;呵呵 以下全部是本人提权时候的总结 很多方法至今没有机会试验也没有成功&#xff0c;但是我是的确看见别人成功过的。本人不才&#xff0c;除了第一种方法自己研究的&#xff0c;其他的都是别人的经验…

Linux 状态命令之内存状态 free

简介 free指令会显示内存的使用情况&#xff0c;包括实体内存&#xff0c;虚拟的交换文件内存&#xff0c;共享内存区段&#xff0c;以及系统核心使用的缓冲区等。 语法 free [-bkmotV][-s <间隔秒数>]参数说明&#xff1a;-b  以Byte为单位显示内存使用情况。-k  以…

SpringMVC在使用Jackson2时关于日期类型格式化的问题

*本例程序使用Jackson2.9.0&#xff0c;jackson1.x的处理方式稍稍有些不同。 在基于Spring&SpringMVC的Web项目中&#xff0c;我们常使用Jackson(1.x/2.x)来增加程序对Json格式的数据的支持。 因此&#xff0c;在实际应用中有个常见的需求&#xff1a;日期的格式化。 假设&…

GDB 使用——Linux C编程

简述 一 列文件清单 二&#xff1a;执行程序 三&#xff1a;显示数据 四&#xff1a;断点(breakpoint) 五&#xff0e;断点的管理 六&#xff0e;变量的检查和赋值 七. 单步执行 八&#xff0e;函数的调用 九&#xff0e;机器语言工具 …

python拨号_python 拨号代码(win10 系统亲测有效)

# -*- coding: utf-8 -*-import win32rasimport time,osdef Connect(dialname, account, passwd):dial_params (dialname, , , account, passwd, )return win32ras.Dial(None, None, dial_params, None)def DialBroadband():dialname u宽带连接 #just a nameaccount u059291…

HP服务器引导盘下载地址

HP SmartStart CD 8.7 x32版本的下载地址为&#xff1a;http://ftp.hp.com/pub/softlib2/software1/cd/p1040463476/v63549/smartstart-8.70-0-x86.zip HP SmartStart CD 8.7 x32版本支持以下机型&#xff1a; HP ProLiant ML 和 DL 300、500 和 700 系列以及 HP ProLiant BL S…

MUI - 预加载

打开详情页回到顶部:document.body.scrollTop document.documentElement.scrollTop 0;方式一&#xff1a;preload一次仅能预加载一个页面&#xff08;除非循环&#xff09; var subWebview mui.preload({url: examples/accordion.html,id: template_sub,top: styles: {48 …

python 分类变量xgboost_【转】XGBoost参数调优完全指南(附Python代码)

xgboost入门非常经典的材料&#xff0c;虽然读起来比较吃力&#xff0c;但是会有很大的帮助&#xff1a;英文原文链接:https://www.analyticsvidhya.com/blog/2016/03/complete-guide-parameter-tuning-xgboost-with-codes-python/

用 GDB 调试Linux程序及有用技巧

用 GDB 调试Linux程序及有用技巧(转) armlinux 2008-06-19 10:48 阅读91 评论0 字号&#xff1a; 大大 中中 小小 GNU的调试器称为gdb&#xff0c;该程序是一个交互式工具&#xff0c;工作在字符模式。在 X Window 系统中&#xff0c;有一个gdb的前端图形工具…

Bash : 索引数组

Bash 提供了两种类型的数组&#xff0c;分别是索引数组(indexed array)和关联数组(associative array)。本文主要介绍索引数组的基本用法。 索引数组的基本特点 Bash 提供的数组都是一维数组。任何变量都可以用作索引数组。通过 declare 关键字可以显式的声明一个索引数组。数组…

Flask 第三方组件之 login

在了解使用Flask来实现用户认证之前&#xff0c;我们首先要明白用户认证的原理。假设现在我们自己去实现用户认证&#xff0c;需要做哪些事情呢&#xff1f; 首先&#xff0c;登录。用户能够输入用户名和密码进行登录&#xff0c;所以需要网页和表单&#xff0c;实现用户输入和…

Zookeeper客户端Curator使用详解

http://www.jianshu.com/p/70151fc0ef5dZookeeper客户端Curator使用详解 简介 Curator是Netflix公司开源的一套zookeeper客户端框架&#xff0c;解决了很多Zookeeper客户端非常底层的细节开发工作&#xff0c;包括连接重连、反复注册Watcher和NodeExistsException异常等等。Pat…