• 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     }
     
     
  • 相关阅读:
    NOIp2018集训test-9-23
    NOIp2018集训test-9-22(am/pm) (联考三day1/day2)
    NOIp2018集训test-9-21(am/pm)
    NOIp2018集训test-9-19(am&pm)
    day41.txt
    day40表关系
    day39
    day38数据库
    day37
    day36
  • 原文地址:https://www.cnblogs.com/zouhao/p/7842643.html
Copyright © 2020-2023  润新知