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

时间:2019-01-13 00:38:00

标签: c# recursion search directory

我需要帮助,因为我已经编写了一种方法,该方法应该在确实存在的计算机上找到特殊目录。 首先,我编写了一种方法,该方法将遍历计算机上的每个驱动器,并为每个驱动器打开递归方法。

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条件,并将本地“结果”设置为该查找文件夹。到现在为止,这确实是我的意图。但是递归方法将进一步搜索,总返回值为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;

这对我来说是有效的,但不是我想要的东西,因为递归方法应该有可能返回该通缉文件夹...

对我来说已经很晚了,我只想解决这个小错误! 有人可以帮我,因为我很绝望,谢谢!

2 个答案:

答案 0 :(得分:1)

找到匹配项并返回它,然后在对Locate()的嵌套调用中放开一次,将匹配项分配给result,但是在实际上想要中断时继续循环出来。

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

此外,您可能会考虑仅捕获UnauthorizedAccessException,因为如果您没有特定目录的许可权,它将被抛出。

答案 1 :(得分:0)

这是我尝试过的解决方案,现在对我有用:

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;
    }

首先,我必须检查循环中的当前“目录”是否已为所需的文件夹。如果不是,则循环必须在该文件夹中浏览,并且如果该文件夹中的结果不是所查找的文件夹,则循环必须继续并在循环中的下一个文件夹中或下一个文件夹中进行搜索。 无论如何找到正确的目录,循环都会“中断”并返回结果! 就是这样!