Вернуть неубивающую рекурсивную функцию - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть бит кода, который ищет файл на всем компьютере и, найдя его, должен вернуть этот файл. Проблема во второй функции, рекурсивной. Как только файл найден, он должен вернуть, что он и делает, но по какой-то причине, даже после возврата значения, он продолжает рекурсивный поиск.

Я не получаю его. Я все еще считаю себя новичком в программировании, поэтому, пожалуйста, объясните подробно, если вы видите, что я делаю неправильно.

public string SearchDirectory(string dir, string fileName)
{
    string foundDir = "";
    bool fileFound = false;
    // Gets all files from directory and creates list of matches to fileName
    try
    {
        foreach (string match in Directory.GetFiles(dir, fileName))
        {
            // Returns the first found match as a path and breaks loop
            Console.WriteLine("Checked path: " + dir + ".");
            if (File.Exists(dir + @"\" + fileName))
            {
                Console.WriteLine("FOUND!!");
                fileFound = true;
                foundDir = dir;
                break;
            }
            if (fileFound == true)
            {
                break;
            }
        }
    }
    catch
    {
        Console.WriteLine("Access to path: " + dir + " denied.");
    }

    // If fileName isn't found in directory, it searches each new directory
    // The last directory it will check is the last one in the original directory
    if (fileFound == false)
    {
        try
        {
            foreach (string newDirectory in Directory.GetDirectories(dir))
            {
                Console.WriteLine("Checked path: " + dir + ".");
                SearchDirectory(newDirectory, fileName);
            }
        }
        catch
        {
            Console.WriteLine("Access to path: " + dir + " denied.");
        }
        // fileName does not exist in starting directory
    }
    else
    {
        return foundDir;
    }
    return "";
}

Ответы [ 2 ]

5 голосов
/ 18 февраля 2020

Ваш рекурсивный вызов игнорирует возвращаемое значение. Вместо этого вам следует проверить, нашел ли он что-то, чтобы вы могли прекратить поиск в других подкаталогах.

foreach (string newDirectory in Directory.GetDirectories(dir))
{
    Console.WriteLine("Checked path: " + dir + ".");
    var result = SearchDirectory(newDirectory, fileName);
    if(result != "") return result;
}
0 голосов
/ 18 февраля 2020

Вы можете просто сделать это вместо:

public string SearchDirectory(string dir, string fileName)
{
  return Directory
    .EnumerateFiles(dir, fileName, SearchOption.AllDirectories)
    .FirstOrDefault() ?? "";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...