2012-06-30 3 views
1

Directory.GetDirectories() 메서드에 문제가 있음을 발견 한 복제 파일 소프트웨어를 완성하려고 시도하는 동안. 어떤 이유로 든 폴더에 액세스 할 수 없을 때 (대부분 시스템 폴더 인 폴더 때문에) 예외가 발생하기 때문에 루프가 중지됩니다.재귀 메서드 완료시기를 알려주는 방법

재귀를 수동으로 수행하는 최선의 방법이 무엇인지 알아 내려고 노력한 후 내 요구에 완벽하게 부합하는 Marc Gravell's example을 발견했습니다.

내 문제는 위의 방법으로 재귀 메서드가 파일/폴더 처리를 마쳤을 때 어떻게 알 수 있는지 파악할 수 없다는 것입니다. 문제에 대한 어떤 통찰력도 인정 될 것입니다.

미리 감사드립니다.

+0

당신이 진행 표시 줄을 원하는 했습니까? 메서드가 폴더 계층을 가로 지르면서 folderDepth 및 증분/감소라는 멤버 변수를 가질 수 있습니다. 메소드를 실행하기 전에'Debug.Write (folderDepth)'를 넣으면 끝낼시기를 더 잘 예측할 수있다. 그냥 내 2 센트 :)이 질문에 대한 답변을 지금 듣고 싶습니다. +1 –

+0

현재 사용자에게 메시지를 출력하기 위해 검색이 완료되면 주요 관심사는 파악하는 것입니다. 변수에 대한 귀하의 제안은 Directory.GetDirectories()와 같은 것을 사용하지 않고, 선택된 폴더에 이미 몇 개의 폴더가 있는지를 알 필요가 있음을 의미합니다. 길이 – denied66

답변

1

는 동작 comepletes 후 메시지 상자를 넣어 :

static void Main() 
{ 
    string path = ""; // TODO 
    ApplyAllFiles(path, ProcessFile, FolderProcessed); 
    MessageBox.Show("Operation complete."); 
} 
+0

글쎄 이것은 어색하다 ... 내 뇌가 어떤 이유로 정상적으로 작동하지 않는 것 같아서, 재귀가 일어나고있는 동안 스레드가 차단되지 않았다고 생각했다. 도와 주셔서 감사합니다. – denied66

+0

도움이 된 것을 기쁘게 생각합니다. 스레드를 언급 한 이래로 마지막 메모가 있습니다.이 답변의 링크 중 일부를 살펴보십시오. http://stackoverflow.com/a/10965388/495455 –

+0

내 질문에 대한 귀하의 의견을 명확히 해 주셔서 감사합니다. 하지만 여전히 프로세스 바를 사용하여 프로세스를 표시하는 데이 방법을 사용할 수는 없습니다. 프로세스를 어딘가에 설명하기 위해 결과가 무엇인지 알아야합니까? 현재의 디자인은 그렇게 제공하지 않는 것 같습니다. Marc Gravell의 예제를 통해 얼마나 많은 파일을 재귀해야하는지 알 수없고 Directory.GetDirectories()를 사용하여 예외가 발생할 위험이 있습니다. 고맙게도이 프로그램은 이러한 상황에서 어려운 일이 될 것 같아 진행 과정을 설명하는 것을 포함하지 않습니다. – denied66

0

당신이하려는 일을 명확히 할 수 있습니까?

마크 (Marc)가 제공 한 예제 코드에서 발견 된 모든 파일에 대해 호출 할 Action을 제공해야합니다. 따라서 해당 액션을 호출하면 해당 파일의 처리가 나타납니다.

폴더 내의 모든 파일과 하위 폴더가 처리 된 시점을 확인하려면 두 번째 작업을 추가하기 위해 코드를 수정해야합니다. 이런 식으로 뭔가 :

using System; 
using System.IO; 
static class Program 
{ 
    static void Main() 
    { 
     string path = ""; // TODO 
     ApplyAllFiles(path, ProcessFile, FolderProcessed); 
    } 
    static void ProcessFile(string path) {/* ... */} 
    static void FolderProcessed(string path) {/* ... */} 

    static void ApplyAllFiles(string folder, Action<string> fileAction, Action<string> folderProcessed) 
    { 
     foreach (string file in Directory.GetFiles(folder)) 
     { 
      fileAction(file); 
     } 
     foreach (string subDir in Directory.GetDirectories(folder)) 
     { 
      try 
      { 
       ApplyAllFiles(subDir, fileAction); 
      } 
      catch 
      { 
       // swallow, log, whatever 
      } 
     } 

     //**** New action invoked here: 
     folderProcessed(folder); 
    } 
} 
+0

여기에서 내가 알아야 할 문제는 모든 파일 또는 폴더가 처리 된 시점 당신이 말하고있는 바를 기반으로, 나는 이미 모든 것들이 처리되었다는 것을 확인할 수있는 객체들을 가진 배열을 가지고 있다는 것을 의미한다. 나는 그 문제없이 폴더/파일들의 수를 얻기위한 어떠한 방법도 사용할 수 없기 때문에 문제가된다. 그 중 하나가 예외를 throw하는 폴더가 될 위험이 있습니다. – denied66

관련 문제