【发布时间】:2011-03-10 14:40:08
【问题描述】:
从顶级目录中获取与某个正则表达式匹配的文件夹列表的最有效方法是什么?我目前只是递归地遍历子文件夹以查看它们是否与正则表达式匹配,如果匹配,我将使用目录路径获取文件名。
由于此目录中的文件夹数量众多,目前使用当前方法进行此搜索大约需要 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)
{
}
}
【问题讨论】:
-
50 分钟意味着你做错了什么。发布您的代码。
-
或者:50 分钟意味着他有很多目录,或者包含的目录位于映射的 UNC 路径或其他慢速设备(如 U 盘、DVD 驱动器等)上。
-
@Abel:其中,我只会给 UNC 场景一个合理的机会。但无论如何,查看代码是“调试”它的合理第一步。
-
这是一个巨大的目录列表,它包含了经过多年编译的大量图像文件。我可以索引该目录,我打算很快做,但我只是希望它尽可能高效地工作。
-
@Jesse:这里的效率意味着:在那个服务器上运行你的代码,而不是从远程位置。它将为您节省 99% 或更多的运行时间。
标签: c# regex search performance directory