Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用正则表达式进行C Sharp文件夹搜索_C#_Regex_Search_Performance_Directory - Fatal编程技术网

C# 使用正则表达式进行C Sharp文件夹搜索

C# 使用正则表达式进行C Sharp文件夹搜索,c#,regex,search,performance,directory,C#,Regex,Search,Performance,Directory,从顶级目录中获取与特定正则表达式匹配的文件夹列表的最有效方法是什么?我现在只是递归地遍历子文件夹,看看它们是否与正则表达式匹配,如果匹配,我就用目录路径获取文件名 目前,由于此目录中的文件夹数量,使用当前方法进行此搜索大约需要50分钟 private void ProcessFiles(string path, string searchPattern) { string pattern = @"^(\\\\server\\folder1\\subfolder\\(MENS|WOMENS

从顶级目录中获取与特定正则表达式匹配的文件夹列表的最有效方法是什么?我现在只是递归地遍历子文件夹,看看它们是否与正则表达式匹配,如果匹配,我就用目录路径获取文件名

目前,由于此目录中的文件夹数量,使用当前方法进行此搜索大约需要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)
    {

    }

}

要在目录树上获得最快的结果,最好的方法是使用互操作。 FindFirstFile、FindNextFile和FindClose是您的朋友


但是如果你有一棵大树要横穿,不要期望光速。我会使用下面的方法,不需要递归,让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的文档:

EnumerateDirectory和GetDirectories方法的区别如下:使用EnumerateDirectory时,可以在返回整个集合之前开始枚举名称集合;使用GetDirectory时,必须等待返回整个名称数组,然后才能访问该数组。因此,当您处理许多文件和目录时,枚举目录可以更有效


关于您的问题:它将遍历它有权访问的所有目录,不要让它从您无权访问的目录开始(它将引发异常)。

您可以在子文件夹上递归启动其他线程,以尝试利用系统的任何并行功能,但大部分开销可能是磁盘访问。

50分钟意味着你做错了什么。发布你的代码。或者:50分钟意味着他有很多目录,或者包括在映射的UNC路径或其他慢速设备(如USB棒、DVD驱动器等)上的目录。@Abel:其中,我只给UNC场景一个合理的机会。但是在任何情况下,查看代码都是“调试”的合理的第一步。这是一个巨大的目录列表,它包含了经过多年编译的大量图像文件。我可以为目录编制索引,我计划很快这样做,但我只是希望它尽可能高效地工作。@Jesse:这里的高效意味着:在该服务器上运行代码,而不是从远程位置运行代码。它将为您节省99%或更多的运行时间。您的方法如何处理我无权访问的目录?它会抛出一个安全异常还是跳过该目录?如果我没有访问特定子目录的权限,我不希望枚举中断。太棒了。我要试一试,看看会发生什么。