从顶级目录获取与特定正则表达式匹配的文件夹列表的最有效方法是什么?我目前只是递归地迭代子文件夹以查看它们是否与正则表达式匹配,如果匹配,我将使用目录路径获取文件名。
目前,由于此目录中的文件夹数量较多,使用当前方法进行此搜索大约需要 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)
{
}
}
我会使用类似下面的东西,不需要递归,让 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
。微软的文档是这样说的 http://msdn.microsoft.com/en-us/library/dd383462.aspx?appId=Dev10IDEF1&l=EN-US&k=k%28SYSTEM.IO.DIRECTORY.ENUMERATEDIRECTORIES%29;k%28ENUMERATEDIRECTORIES%29;k%28SOLUTIONITEMSPROJECT%29;k%28TargetFrameworkMoniker-%22.NETFRAMEWORK&k=VERSION=V4.0%22%29;:
EnumerateDirectories 和 GetDirectories 方法的区别如下: 使用 EnumerateDirectories 时,可以在返回整个集合之前开始枚举名称集合;当您使用 GetDirectories 时,必须等待返回整个名称数组才能访问该数组。因此,当您处理许多文件和目录时,EnumerateDirectories 会更加高效。
关于您的问题:它将遍历它有权访问的所有目录,不要让它从您无权访问的目录开始(它会引发异常)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)