Как ограничить глубину рекурсивного поиска в подкаталоге - PullRequest
6 голосов
/ 06 октября 2010

У меня есть функция, которая в настоящее время захватывает все папки и подпапки, чтобы проверить ACL на предмет небольшого инструмента, который я строю, но я дергаю себя за волосы, пытаясь понять, как ограничить возможную глубинуидти к.Например, у вас есть папка, которая имеет 4 уровня глубины, но я хочу иметь возможность получить только 3 уровня для ACL.

В настоящее время у меня она закодирована следующим образом:

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

Очевидно,это не так хорошо, как раньше, потому что я немного поработал над этой проблемой, но если кто-то может указать мне правильное направление для решения этой проблемы, я был бы очень рад!

Ответы [ 3 ]

18 голосов
/ 06 октября 2010

Во-первых, не объявляйте поле recCount снаружи как «глобальную» переменную. В рекурсивных сценариях обычно более удобно передавать состояние по рекурсивным вызовам.

Во-вторых, переместите тест глубины из foreach, чтобы удалить ненужные запросы файловой системы для подкаталогов.

В-третьих, поместите фактическую логику обработки в начало вашего метода, снова из цикла обработки подкаталогов.

Ваш код будет выглядеть так:

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);
    }
}
5 голосов
/ 06 октября 2010

Один из возможных методов, добавить поле класса за пределами вашего метода и переменную, чтобы указать, сколько уровней нужно пройти максимально.

int level;

private void StepThroughDirectories(string dir, int depth)
{
    levels ++;
    if (levels > depth)
        return;
    string[] directories = Directory.GetDirectories(dir);
    try
    { ...
2 голосов
/ 06 октября 2010

Уменьшите recCount, когда вы вернетесь из StepThroughDirectories, но это было бы лучше ...

    private void StepThroughDirectories(string dir, int depth)
    {
        if (depth < 0)
            return;
        string[] directories = Directory.GetDirectories(dir);
        try
        {
            foreach (string d in Directory.GetDirectories(dir))
            {
                // your code here
                Console.WriteLine("{0}", d);
                StepThroughDirectories(d, depth-1);
            }
        }
        catch (System.Exception e)
        {
            Console.WriteLine(e.Message);
        }
    } 
...