Domanda

Attualmente sto sviluppando un'applicazione che utilizza lo spazio dei nomi System.DirectoryServices per creare un oggetto DirectoryEntry e scorrere l'intera gerarchia per raccogliere informazioni.

Non conosco il numero di voci figlio per ciascun oggetto DirectoryEntry nella gerarchia, quindi non posso creare un numero N di cicli nidificati per gli spider tramite la proprietà Children

Ecco il mio esempio di pseudocodice:

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

La mia domanda è: qual è il modo migliore per creare un ciclo per raccogliere informazioni se non conosci il numero di sottodirectory nel tuo oggetto?

(Questo può essere applicato a qualsiasi tipo di oggetto di cui non si conosce la gerarchia degli oggetti)

È stato utile?

Soluzione

Con una funzione ricorsiva, se non si conosce la profondità della gerarchia e la necessità di attraversare verso il basso attraverso tutti i livelli. Sotto è un esempio usando attraversamento in profondità.

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

In alternativa, senza ricorsione, si può fare un attraversamento con l'aggiunta di una struttura dati Coda o Stack e conservare gli oggetti che hai visto, ma havent ancora visitato.

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

Altri suggerimenti

Devi scrivere funzione ricorsiva come ...

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

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

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

Si potrebbe utilizzare una funzione che si definisce ricorsivamente sui bambini.  condizione di uscita: non più bambini, ecc ..

Un'opzione è utilizzare la ricorsione.Imposta quel codice in una funzione che poi richiama se stessa all'interno del ciclo foreach, passando ogni volta la directory successiva (elemento figlio)

Benvenuti nel meraviglioso mondo della ricorsione. Hai bisogno di una funzione che accetta una directory come argomento. Dato che directory, si guarda tutte le directory del bambino e per ognuno ... si definisce.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top