c# – C使用正则表达式搜索Sharp文件夹
从顶级目录获取与特定正则表达式匹配的文件夹列表的最有效方法是什么?我目前只是递归迭代子文件夹以查看它们是否与正则表达式匹配,如果它们匹配,我将使用目录路径获取文件名.
目前,由于此目录中的文件夹数量,此搜索大约需要50分钟才能使用当前方法. private void ProcessFiles(string path,string searchPattern) { string pattern = @"^(\serverfolder1subfolder(MENS|WOMENS|MENSsDROPBOX|WOMENSsDROPBOX)((((COLORsCHIPS)|(ALLsMENSsCOLORS)))|((d{4})(w+)(FINALsART|FINALsARTWORK)(d{3}))))$"; DirectoryInfo di = new DirectoryInfo(path); try { Debug.WriteLine("I'm in " + di.FullName); if (di.Exists) { DirectoryInfo[] dirs = di.GetDirectories("*",SearchOption.TopDirectoryOnly); foreach (DirectoryInfo d in dirs) { string[] splitPath = d.FullName.Split(''); var dirMatch = new Regex(pattern,RegexOptions.IgnoreCase); if (dirMatch.IsMatch(d.FullName)) { Debug.WriteLine("---Processing Directory: " + d.FullName + " ---"); FileInfo[] files = d.GetFiles(searchPattern,SearchOption.TopDirectoryOnly); AddColor(files,splitPath); } ProcessFiles(d.FullName,searchPattern); } } } catch (Exception e) { } } 解决方法
我会使用类似下面的内容,不需要递归,让BCL为你做:
// I didn't recount the parenetheses... Regex re = new Regex("MENS|WOMENS|MENSsDROPBOX|WOMENSsDROPBOX)((((COLORsCHIPS)|(ALLsMENSsCOLORS)))|((d{4})(w+)(FINALsART|FINALsARTWORK)(d{3})))"); var dirs = from dir in Directory.EnumerateDirectories(dirPath,"dv_*",SearchOption.AllDirectories) where re.IsMatch(dir) select dir; 如果它仍然运行50分钟,你只是在慢速驱动器,网络或类似的. 编辑:你编辑了你的问题.它清楚地表明您在UNC路径上运行代码.这非常慢,如果您需要速度,请在该服务器上运行它. 注意:GetDirectories(您使用的)和EnumerateDirectories的行为之间存在很大差异. Microsoft的文档says this about it:
关于你的问题:它将遍历它有权访问的所有目录,不要让它从你无法访问的目录开始(它会引发异常). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |