Pregunta

Actualmente estoy desarrollando una aplicación que utiliza el espacio de nombres System.DirectoryServices para crear un objeto DirectoryEntry y recorrer toda la jerarquía para recopilar información.

No sé el número de entradas secundarias para cada objeto DirectoryEntry en la jerarquía, así que no puedo crear un número N de bucles anidados a las arañas a través de la propiedad de los niños

Aquí está mi ejemplo pseudo código:

//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
    }
}

Mi pregunta es, ¿cuál es la mejor manera de crear un bucle para recopilar información si así se conoce el número de subdirectorios en su objeto?

(Esto se puede aplicar a cualquier tipo de objeto que no conoce la jerarquía de objetos)

¿Fue útil?

Solución

Utilice una función recursiva si usted no sabe la profundidad de la jerarquía y la necesidad de recorrer a través de todos los niveles. A continuación se muestra un ejemplo usando recorrido en profundidad.

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

Como alternativa, sin recursividad, se puede hacer un recorrido por la adición de una estructura de datos de la cola o la pila y el almacenamiento de los objetos que usted ha visto, pero no has visitado todavía.

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

Otros consejos

Tienes que escribir la función recursiva como ...

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

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

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

Se puede usar una función que llama a sí misma recursivamente en los niños.  condición de salida: no más niños etc ..

Una opción es utilizar la recursividad. Establecer ese código en una función que se llama a sí misma dentro del bucle foreach, pasando el directorio siguiente (elemento secundario) cada vez

Bienvenido al maravilloso mundo de la recursividad. Se necesita una función que acepta un directorio como argumento. Teniendo en cuenta ese directorio, que mira hacia arriba todos los directorios secundarios y para cada uno ... llama a sí misma.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top