C#递归文件夹搜索无法正常工作

C#递归文件夹搜索无法正常工作,c#,recursion,search,directory,C#,Recursion,Search,Directory,我需要帮助,因为我已经写了一个方法,可以在一台肯定存在的计算机上找到一个特殊的目录。 首先,我写了一个方法,它将遍历计算机上的每个驱动器,并为每个驱动器打开递归方法 private string LocateOnDrives() { string result = string.Empty; string[] drives = Directory.GetLogicalDrives(); foreach (string drive in d

我需要帮助,因为我已经写了一个方法,可以在一台肯定存在的计算机上找到一个特殊的目录。 首先,我写了一个方法,它将遍历计算机上的每个驱动器,并为每个驱动器打开递归方法

private string LocateOnDrives()
    {
        string result = string.Empty;
        string[] drives = Directory.GetLogicalDrives();

        foreach (string drive in drives)
        {
            string buffer = this.Locate(drive);

            if (buffer.EndsWith(SEARCH_PATTERN))
            {
                return buffer;
            }
        }

        return result;
    }
这是为每个驱动器调用的方法:

private string Locate(string directory)
    {
        string result = string.Empty;

        try
        {
            string[] dirs = Directory.GetDirectories(directory);

            foreach (string dir in dirs)
            {
                if (dir.EndsWith(SEARCH_PATTERN))
                {
                    return dir;
                }
                else
                {
                    result = this.Locate(dir);
                }
            }
        }
        catch { }            

        return result;
    }
try-catch是必需的,因为有些目录没有权限。我拥有搜索文件夹的权限,当我调试此文件夹时,它将跳转到它已找到的if条件,并将本地“result”设置为此搜索文件夹。到目前为止,这确实说明了我的意图。但是递归方法将进一步搜索,并且总体返回为string.Empty

我已经做了一些链接:

private string tragetDir;
    private string Locate(string directory)
    {
        string result = string.Empty;

        try
        {
            string[] dirs = Directory.GetDirectories(directory);

            foreach (string dir in dirs)
            {
                if (dir.EndsWith(DEFAULT_GTAV_DIRECTORY_NAME))
                {
                    targetDir = dir;
                }
                else
                {
                    result = this.Locate(dir);
                }
            }
        }
        catch { }            

        return result;
这对我来说是可行的,但不是我想要的,因为递归方法可能会返回这个想要的文件夹

对我来说太晚了,我只想纠正这个小错误!
有人能帮帮我吗,因为我很绝望,谢谢

当您找到一个匹配项并返回它时,然后在对
Locate()
的嵌套调用中释放一次,您将匹配项分配给
result
,但当您确实想要打破它时,继续循环

result = this.Locate(dir, SEARCH_PATTERN);
if (result.EndsWith(SEARCH_PATTERN))
{
    break;
}

也可以考虑只使用<代码>未授权的Access异常>代码>,因为如果您没有对某个特定目录的许可,它会被抛出。

< P>这是我尝试过的一种解决方案,它现在对我起作用了:

private string Locate(string directory)
    {
        string result = string.Empty;

        string[] dirs = new string[0];

        try
        {
            dirs = Directory.GetDirectories(directory);
        }
        catch { /* Ignore */ }            

        foreach (string dir in dirs)
        {
            if (dir.EndsWith(SEARCH_PATTERN))
            {
                result = dir;
                break;
            }
            else
            {
                result = this.Locate(dir);

                if (result.EndsWith(SEARCH_PATTERN))
                {
                    break;
                }
            }                
        }           
        return result;
    }
首先,我必须检查循环中当前的“dir”是否已经是查找的文件夹。如果不是,则循环必须在该文件夹内浏览,如果该文件夹内的结果不是所搜索的文件夹,则循环必须继续并搜索循环中的下一个文件夹。 在找到正确目录的任何情况下,循环都将“中断”并返回结果!
就是这样

这实际上帮助我犯了错误。这不是正确的解决方案,因为你我必须同时检查dir和潜在正确答案的结果。