2009-04-01 4 views
2

현재 System.DirectoryServices 네임 스페이스를 사용하여 DirectoryEntry 개체를 만들고 정보를 수집하기 위해 전체 계층을 반복하는 응용 프로그램을 개발 중입니다.DirectoryEntry 또는 임의의 개체 계층 구조를 반복 - C#

내가 계층 구조의 각하여 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 
    } 
} 

제 질문은 개체의 하위 디렉터리 수를 모르는 경우 정보를 수집하기위한 루프를 만드는 가장 좋은 방법은 무엇입니까?

답변

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

또는 재귀없이, 당신은 본 적이 있지만, 아직 방문 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); 
      } 
     } 
    } 
} 
+0

이, BTW, 재귀가 실제로 문제를 처리하는 좋은 방법이다의 좋은 예입니다. 파일 시스템 자체가 깊이 제한을 부과하기 때문에 스택을 날려서는 안됩니다. 그러나 트리에 루프가있을 경우 조심해야합니다. –

+0

@jeffmaphone : DirectoryEntry는 실제로 파일 시스템이 아닌 LDAP 서버를 가리키고 있습니다. LDAP 깊이 제한에 대해서는 잘 모르겠지만 루프가있는 경우이를 처리하는 가장 쉬운 방법은 방문한 각 항목의 GUID를 기록하고 동일한 항목을 두 번 방문하면 재귀를 중지하는 것입니다. –

+0

foreach-loop 내에서'using (child) {...}'를 사용하여 자신을 정리해야합니다. http://stackoverflow.com/questions/41378746/disposing-during-foreach/41378945#41378945 – Born2Smile

1

당신은 반복적으로 아동에 자신을 호출하는 기능을 사용할 수 있습니다 (이것은 당신이 개체의 계층 구조를 모르는 객체의 모든 유형에 적용 할 수 있습니다). 종료 조건 : 더 이상 자식 등이 없습니다.

1

하나의 옵션은 재귀를 사용하는 것입니다. 매번 다음 번 디렉토리 (자식 항목)를 전달하여 foreach 루프 내에서 자체를 호출하는 함수에 코드를 설정하십시오.

1

멋진 재귀 세계에 오신 것을 환영합니다. Directory를 인수로 받아들이는 함수가 필요합니다. 해당 디렉토리를 감안할 때, 모든 하위 디렉토리를 조회하고 각 디렉토리에 대해 자체를 호출합니다. 당신은 같은 재귀 함수를 작성해야

2

...

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

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

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