JoshuaWashua
JoshuaWashua

Reputation: 1

Return not killing recursive function

I have the bit of code that searches the entire computer for a file and once found, should return that file. The problem is in the second function, the recursive one. Once the file is found, it should return, which it does, but for some reason, even after returning the value, it continues the recursive search.

I don't get it. I'd still consider myself new to programming so please explain in detail if you see what I'm doing wrong.

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

Upvotes: 0

Views: 84

Answers (2)

Robert McKee
Robert McKee

Reputation: 21477

You could just do this instead:

public string SearchDirectory(string dir, string fileName)
{
  return Directory
    .EnumerateFiles(dir, fileName, SearchOption.AllDirectories)
    .FirstOrDefault() ?? "";
}

Upvotes: 0

juharr
juharr

Reputation: 32296

Your recursive call is ignoring the returned value. You should instead check to see if it found something so you can stop searching more sub-directories.

foreach (string newDirectory in Directory.GetDirectories(dir))
{
    Console.WriteLine("Checked path: " + dir + ".");
    var result = SearchDirectory(newDirectory, fileName);
    if(result != "") return result;
}

Upvotes: 5

Related Questions