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

 
 

C#递归搜索指定目录下的文件或目录相关推荐

  1. 8.var目录下的文件和目录详解

    1./var目录下的文件和目录详解. /var (该目录存放的是不断扩充且经常修改的目录,包括各种日志文件或者pid文件,存放linux的启动日志和正在运行的程序目录(变化的目录:一般是日志文件,ca ...

  2. 9.proc目录下的文件和目录详解

    1./proc目录下的文件和目录详解 /proc:虚拟目录.是内存的映射,内核和进程的虚拟文件系统目录,每个进程会生成1个pid,而每个进程都有1个目录. /proc/Version:内核版本 /pr ...

  3. php遍历指定目录下的文件,PHP遍历指定目录下所有文件和目录

    PHP目录遍历程序代码,将显示指定目录下的所有文件和文件夹,并列出这些文件,最后统计出文件总数.使用的PHP函数有is_dir.closedir.scan_dir等. 本代码比较准确,可判断目录下的是 ...

  4. Golang获取目录下的文件及目录信息

    一.获取当前目录下的文件或目录信息(不包含多级子目录) func main() {pwd,_ := os.Getwd()//获取文件或目录相关信息fileInfoList,err := ioutil. ...

  5. java递归url目录_Java递归实现某个目录下所有文件和目录

    import java.io.File; import java.util.ArrayList; public class Test1// 实现打印某个目录下的所有文件和目录,要目录在上,文件在下,每 ...

  6. Shell脚本实现统计指定目录下的文件和目录数量

    编写一个shell脚本,根据其属性计算给定目录中文件和目录的数量. 要求: ▪调用脚本countdf.sh ▪运行脚本时,在命令行中使用目录的路径,例如 ./countdf.sh〜 /test01.这 ...

  7. 操作目录下的文件或目录

    1.显示/var目录下所有以l开头,以一个小字母结尾,且中间出现一位数字的文件或目录:             # ls /var/l*[[:digit:]]*[[:lower:]] 2.显示/etc ...

  8. php获取目录下所有文件及目录(多种方法)

    获取某目录下所有子文件和子目录 function getDirContent($path){if(!is_dir($path)){return false;}//readdir方法/* $dir = ...

  9. File类(常用方法、遍历目录下的文件、listFiles()方法和删除文件及目录)

    File类 File类的常用方法 Filie类常用的构造方法 File(String pathname) //通过指定的一个字符串类型的文件路径来创建一个新的File对象 File(String pa ...

最新文章

  1. scrollview的一些代理方法
  2. junit 案例(三)
  3. MyCAT+MySQL 搭建高可用企业级数据库集群
  4. Win32多线程编程(5) — 线程局部存储
  5. what is the location of js when using run as server in Eclipse
  6. Oracle 游标使用全解(摘抄)
  7. 微信公众号使用LocalStorage解决返回缓存问题
  8. CSND自定义模块管理
  9. sketchup 计算机配置,草图大师2020对电脑配置要求
  10. 以WIN10 22H2为例,下载ISO、制作安装U盘的办法
  11. linux 统计文件字节和行数,Linux命令-统计文件中的字节数、字数、行数:wc
  12. 计算机软件考试成绩查询时间,2020年计算机软考什么时候出成绩,怎么查成绩?|...
  13. Day01_01_Linux_Ubuntu教程之Linux系统简介
  14. 基于ZStack3.0.1(CC2530)和ST7735S的HAL_LCD驱动替换(一)
  15. python异常数据筛选_学习笔记(06):Python数据清理实践-数据过滤,06Python,清洗,实战,筛选...
  16. 计算机西方经济学试题,西方经济学的习题与答案
  17. asp后缀的文件如何运行
  18. 走进VR开发世界(6)——虚拟现实软件开发工具与技术
  19. 在CSDN博客里保持代码格式的方法
  20. 在智能家居领域中传感器技术的应用和新趋势

热门文章

  1. 关于范围for语句的使用
  2. 22种编程语言新年快乐
  3. leetcode35 插入的位置
  4. C++(STL):28 ---关联式容器map用法
  5. C++实现md5加密或计算文件的唯一性识别
  6. 关于wParam和lParam
  7. ubuntu linux下执行.sh文件
  8. SDP协议 学习笔记
  9. 科目三道路考试技巧流程详解
  10. 适用于ATI卡的GPU计算MD5的小程序源码,基于AMD APP SDK开发