Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to Limit The Depth of a Recursive Sub-Directory Search

I've got a function that currently grabs all folders and sub-folders to check the ACL's for a small tool I'm building but I'm pulling my hair out trying to figure out how to limit the depth that it can go to. For example you have a folder that goes 4 levels deep but I want to be able to only grab 3 levels of it for ACL's.

Currently I have it coded thusly:

private void StepThroughDirectories(string dir)
{
    string[] directories = Directory.GetDirectories(dir);
    try
    {
        foreach (string d in Directory.GetDirectories(dir))
        {
            if (recCount < (int)Depth)
            {
                GetACLs(d, new DirectoryInfo(d));
                pBar.Value += 1;
                //MessageBox.Show("Recursive Level: " + counter.ToString());
                recCount++;
                StepThroughDirectories(d);
            }
            else
            {
                recCount--;
            }
        }
    }
    catch (System.Exception e)
    {
        Console.WriteLine(e.Message);
    }
}

Obviously that's not as nice as it was because I've been working on the problem for a little while but if anyone can point me in the right direction to solve this issue I would be very happy!

like image 368
Jeff Bolduan Avatar asked Oct 06 '10 16:10

Jeff Bolduan


2 Answers

First, avoid declaring the recCount field outside as a “global” variable. In recursive scenarios it's usually more manageable to pass state along the recursive calls.

Second, move the depth test out of the foreach to remove unnecessary querying of the file system for subdirectories.

Third, place the actual processing logic at the beginning of your method, again out of the subdirectories processing loop.

Your code would then look like:

void StepThroughDirectories(string dir)
{
    StepThroughDirectories(dir, 0)
}

void StepThroughDirectories(string dir, int currentDepth)
{
    // process 'dir'
    ...

    // process subdirectories
    if (currentDepth < MaximumDepth)
    {
        foreach (string subdir in Directory.GetDirectories(dir))
            StepThroughDirectories(subdir, currentDepth + 1);
    }
}
like image 168
Ondrej Tucny Avatar answered Oct 14 '22 14:10

Ondrej Tucny


One possible method, add a class field outside your method and a variable to indicate how many levels deep to go max.

int levels;

private void StepThroughDirectories(string dir, int depth)
{
    levels ++;
    if (levels > depth)
        return;
    string[] directories = Directory.GetDirectories(dir);
    try
    { ...
like image 24
jac Avatar answered Oct 14 '22 14:10

jac