7

我有一个功能,目前可以抓取所有文件夹和子文件夹,以检查 ACL 是否有我正在构建的小工具,但我正在努力弄清楚如何限制它可以达到的深度。例如,您有一个 4 层深的文件夹,但我希望只能为 ACL 抓取 3 层。

目前我已经这样编码:

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

显然,这并不像以前那么好,因为我一直在研究这个问题一段时间,但如果有人能指出我解决这个问题的正确方向,我会非常高兴!

4

3 回答 3

17

首先,避免将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);
    }
}
于 2010-10-06T16:11:42.143 回答
4

一种可能的方法是在您的方法之外添加一个类字段和一个变量以指示要达到最大深度的级别。

整数级别;

private void StepThroughDirectories(string dir, int depth)
{
    levels ++;
    if (levels > depth)
        return;
    string[] directories = Directory.GetDirectories(dir);
    try
    { ...
于 2010-10-06T16:10:31.880 回答
2

当您从 StepThroughDirectories 返回时减少 recCount,但这会更好......

    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);
        }
    } 
于 2010-10-06T16:10:50.303 回答