C#の - のDirectoryEntryまたは任意のオブジェクト階層をループ
-
22-08-2019 - |
質問
私は現在、情報を収集するために、階層全体を通じてDirectoryEntryオブジェクトとループを作成するために、System.DirectoryServices名前空間を使用するアプリケーションを開発しています。
私は、階層内の各DirectoryEntryオブジェクトの子エントリの番号がわからないので、私は子供のプロパティを介してスパイダーにネストされたループの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
}
}
私の質問は、あなたがそうあなたのオブジェクト内のサブディレクトリの数がわからない場合は情報を収集するためにループを作成するための最良の方法は何か、ですか?
タグ(これは、オブジェクト階層を知っていないことを任意の型のオブジェクトに適用することができます)
解決
あなたは、階層の深さを知っているし、すべてのレベルを介してダウントラバースする必要がない場合は、
再帰関数を使用してください。 以下深さ優先トラバーサルを用いた例である。
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);
}
}
}
}
また、再帰せずに、あなたが見てきたが、まだ訪れたhaventはオブジェクトをキューまたはスタックのデータ構造を追加して格納することにより、トラバースを行うことができます。
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);
}
}
}
}
他のヒント
あなたは再帰関数を記述する必要がありますように...
DirectoryEntry root = new DirectoryEntry(path);
DoForEveryNode(root);
void DoForEveryNode(DirectoryEntry node)
{
// do something..
foreach(DirectoryEntry child in node.Children)
{
DoForEveryNode(child);
}
}
あなたは再帰的に子供たちに自分自身を呼び出す関数を使用することができます。 終了条件:これ以上の子供たちなど。
1つのオプションは、再帰を使用することです。 (子アイテム)毎時間
次のディレクトリを通過し、foreachループの内側に自分自身を呼び出す関数でそのコードを上に設定再帰の素晴らしい世界へようこそ。あなたは、引数としてディレクトリを受け入れる機能を必要としています。そのディレクトリを考えると、それは子ディレクトリのすべてを検索し、それぞれのために...自分自身を呼び出します。
所属していません StackOverflow