从顶级目录获取与某个正则表达式匹配的文件夹列表的最有效方法是什么?我目前只是递归迭代子文件夹以查看它们是否与正则表达式匹配,如果他们这样做,我将使用目录路径获取文件名。
目前,由于此目录中的文件夹数量,此搜索大约需要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)
{
}
}
答案 0 :(得分:7)
我会使用类似下面的内容,不需要递归,让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;
如果它仍然运行50分钟,那么你只是在慢速驱动器,网络或类似设备上。
编辑:你编辑了你的问题。它清楚地表明您在UNC路径上运行代码。这非常慢,如果您需要速度,请在该服务器上运行它。注意:GetDirectories
(您使用的)和EnumerateDirectories
的行为之间存在很大差异。 Microsoft的文档says this about it:
EnumerateDirectories和GetDirectories方法的不同之处如下:使用EnumerateDirectories时,可以在返回整个集合之前开始枚举名称集合;当您使用GetDirectories时,您必须等待返回整个名称数组,然后才能访问该数组。因此,当您使用许多文件和目录时,EnumerateDirectories可以更有效。
关于你的问题:它将遍历它有权访问的所有目录,不要让它从你无法访问的目录开始(它会引发异常)。
答案 1 :(得分:0)
要在目录树上获得最快的结果,最好的方法是使用互操作。 FindFirstFile,FindNextFile,FindClose是你的朋友。
http://msdn.microsoft.com/en-us/library/aa364418%28v=vs.85%29.aspx
但如果你有一棵巨大的树可以穿越,那么不要指望光速。
答案 2 :(得分:0)
您可以递归地在子文件夹上启动其他线程,以尝试利用您的系统所具有的任何并行功能,但可能的大部分开销可能是磁盘访问。