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 }
C#递归搜索指定目录下的文件或目录相关推荐
- 8.var目录下的文件和目录详解
1./var目录下的文件和目录详解. /var (该目录存放的是不断扩充且经常修改的目录,包括各种日志文件或者pid文件,存放linux的启动日志和正在运行的程序目录(变化的目录:一般是日志文件,ca ...
- 9.proc目录下的文件和目录详解
1./proc目录下的文件和目录详解 /proc:虚拟目录.是内存的映射,内核和进程的虚拟文件系统目录,每个进程会生成1个pid,而每个进程都有1个目录. /proc/Version:内核版本 /pr ...
- php遍历指定目录下的文件,PHP遍历指定目录下所有文件和目录
PHP目录遍历程序代码,将显示指定目录下的所有文件和文件夹,并列出这些文件,最后统计出文件总数.使用的PHP函数有is_dir.closedir.scan_dir等. 本代码比较准确,可判断目录下的是 ...
- Golang获取目录下的文件及目录信息
一.获取当前目录下的文件或目录信息(不包含多级子目录) func main() {pwd,_ := os.Getwd()//获取文件或目录相关信息fileInfoList,err := ioutil. ...
- java递归url目录_Java递归实现某个目录下所有文件和目录
import java.io.File; import java.util.ArrayList; public class Test1// 实现打印某个目录下的所有文件和目录,要目录在上,文件在下,每 ...
- Shell脚本实现统计指定目录下的文件和目录数量
编写一个shell脚本,根据其属性计算给定目录中文件和目录的数量. 要求: ▪调用脚本countdf.sh ▪运行脚本时,在命令行中使用目录的路径,例如 ./countdf.sh〜 /test01.这 ...
- 操作目录下的文件或目录
1.显示/var目录下所有以l开头,以一个小字母结尾,且中间出现一位数字的文件或目录: # ls /var/l*[[:digit:]]*[[:lower:]] 2.显示/etc ...
- php获取目录下所有文件及目录(多种方法)
获取某目录下所有子文件和子目录 function getDirContent($path){if(!is_dir($path)){return false;}//readdir方法/* $dir = ...
- File类(常用方法、遍历目录下的文件、listFiles()方法和删除文件及目录)
File类 File类的常用方法 Filie类常用的构造方法 File(String pathname) //通过指定的一个字符串类型的文件路径来创建一个新的File对象 File(String pa ...
最新文章
- scrollview的一些代理方法
- junit 案例(三)
- MyCAT+MySQL 搭建高可用企业级数据库集群
- Win32多线程编程(5) — 线程局部存储
- what is the location of js when using run as server in Eclipse
- Oracle 游标使用全解(摘抄)
- 微信公众号使用LocalStorage解决返回缓存问题
- CSND自定义模块管理
- sketchup 计算机配置,草图大师2020对电脑配置要求
- 以WIN10 22H2为例,下载ISO、制作安装U盘的办法
- linux 统计文件字节和行数,Linux命令-统计文件中的字节数、字数、行数:wc
- 计算机软件考试成绩查询时间,2020年计算机软考什么时候出成绩,怎么查成绩?|...
- Day01_01_Linux_Ubuntu教程之Linux系统简介
- 基于ZStack3.0.1(CC2530)和ST7735S的HAL_LCD驱动替换(一)
- python异常数据筛选_学习笔记(06):Python数据清理实践-数据过滤,06Python,清洗,实战,筛选...
- 计算机西方经济学试题,西方经济学的习题与答案
- asp后缀的文件如何运行
- 走进VR开发世界(6)——虚拟现实软件开发工具与技术
- 在CSDN博客里保持代码格式的方法
- 在智能家居领域中传感器技术的应用和新趋势