2

我目前正在开发一个应用程序,它使用 System.DirectoryServices 命名空间来创建一个 DirectoryEntry 对象并遍历整个层次结构以收集信息。

我不知道层次结构中每个 DirectoryEntry 对象的子条目数,因此我无法通过 Children 属性为蜘蛛创建 N 个嵌套循环

这是我的伪代码示例:

//root directory
DirectoryEntry root = new DirectoryEntry(path);

if(DirectoryEntry.Childern != null)
{
    foreach(DirectoryEntry child in root.Children)
    {
        //loop through each Children property unitl I reach the last sub directory
    }
}

我的问题是,如果您不知道对象中子目录的数量,那么创建一个循环来收集信息的最佳方法是什么?

(这可以应用于您不知道对象层次结构的任何类型的对象)

4

5 回答 5

5

如果您不知道层次结构的深度并且需要向下遍历所有级别,请使用递归函数。下面是一个使用深度优先遍历的例子。

using (DirectoryEntry root = new DirectoryEntry(someDN))
{
    DoSomething(root);
}


function DoSomething(DirectoryEntry de)
{
    // Do some work here against the directory entry

    if (de.Children != null)
    {
        foreach (DirectoryEntry child in de.Children)
        {
            using (child)
            {
                DoSomething(child);
            }
        }
    }
}

或者,无需递归,您可以通过添加 Queue 或 Stack 数据结构并存储您已经看到但尚未访问的对象来进行遍历。

Queue<DirectoryEntry> queue = new Queue<DirectoryEntry>();
DirectoryEntry root = new DirectoryEntry(someDN);
queue.Add(root);

while (queue.Any())
{
    using (DirectoryEntry de = queue.Dequeue())
    {
        // Do some work here against the directory entry

        if (de.Children != null)
        {
            foreach (DirectoryEntry child in de.Children)
            {
                queue.Enqueue(child);
            }
        }
    }
}
于 2009-04-01T17:01:46.023 回答
2

您必须将递归函数编写为...

DirectoryEntry root = new DirectoryEntry(path);
DoForEveryNode(root);

void DoForEveryNode(DirectoryEntry node)
{
    // do something..

    foreach(DirectoryEntry child in node.Children)
    {
        DoForEveryNode(child);
    }
}
于 2009-04-01T17:06:56.807 回答
1

您可以使用递归调用子级的函数。退出条件:没有更多的孩子等。

于 2009-04-01T17:01:33.153 回答
1

一种选择是使用递归。将该代码设置在一个函数中,然后在 foreach 循环中调用自身,每次都传递下一个目录(子项)

于 2009-04-01T17:02:11.077 回答
1

欢迎来到递归的美妙世界。您需要一个接受 Directory 作为参数的函数。给定该目录,它会查找所有子目录,并为每个子目录...调用自身。

于 2009-04-01T17:02:48.177 回答