循环遍历DirectoryEntry或任何对象层次结构 - C#

时间:2009-04-01 16:55:31

标签: c# loops hierarchy web-crawler directoryservices

我目前正在开发一个使用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
    }
}

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

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

5 个答案:

答案 0 :(得分: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<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);
            }
        }
    }
}

答案 1 :(得分:2)

你必须把递归函数写成......

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

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

    foreach(DirectoryEntry child in node.Children)
    {
        DoForEveryNode(child);
    }
}

答案 2 :(得分:1)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

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

相关问题