Jes*_*sse 3 c# regex directory performance search
从顶级目录获取与特定正则表达式匹配的文件夹列表的最有效方法是什么?我目前只是递归迭代子文件夹以查看它们是否与正则表达式匹配,如果它们匹配,我将使用目录路径获取文件名.
目前,由于此目录中的文件夹数量,此搜索大约需要50分钟才能使用当前方法.
private void ProcessFiles(string path, string searchPattern)
{
string pattern = @"^(\\\\server\\folder1\\subfolder\\(MENS|WOMENS|MENS\sDROPBOX|WOMENS\sDROPBOX)\\((((COLOR\sCHIPS)|(ALL\sMENS\sCOLORS)))|((\d{4})\\(\w+)\\(FINAL\sART|FINAL\sARTWORK)\\(\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)
{
}
}
Run Code Online (Sandbox Code Playgroud)
我会使用类似下面的内容,不需要递归,让BCL为你做:
// I didn't recount the parenetheses...
Regex re = new Regex("MENS|WOMENS|MENS\sDROPBOX|WOMENS\sDROPBOX)\\((((COLOR\sCHIPS)|(ALL\sMENS\sCOLORS)))|((\d{4})\\(\w+)\\(FINAL\sART|FINAL\sARTWORK)\\(\d{3})))");
var dirs = from dir in
Directory.EnumerateDirectories(dirPath, "dv_*",
SearchOption.AllDirectories)
where re.IsMatch(dir)
select dir;
Run Code Online (Sandbox Code Playgroud)
如果它仍然运行50分钟,你只是在慢速驱动器,网络或类似的.
编辑:你编辑了你的问题.它清楚地显示您在UNC路径上运行代码.这非常慢,如果您需要速度,请在该服务器上运行它.
注意:(GetDirectories你使用的)行为和EnumerateDirectories.微软的文档说明了这一点:
EnumerateDirectories和GetDirectories方法的不同之处如下:使用EnumerateDirectories时,可以在返回整个集合之前开始枚举名称集合; 当您使用GetDirectories时,您必须等待返回整个名称数组,然后才能访问该数组.因此,当您使用许多文件和目录时,EnumerateDirectories可以更高效.
关于你的问题:它将遍历它有权访问的所有目录,不要让它从你无法访问的目录开始(它会引发异常).