Bucle a través de DirectoryEntry o cualquier jerarquía de objetos - C #
-
22-08-2019 - |
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)
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.