2016-09-27 2 views
-2

전에 문제가 있었지만 해결 했으므로이 문제를 해결할 수 없습니다.foreach 루프 전에 if 문이 실행되는 이유는 무엇입니까?

문이 foreach 루프 이전에 호출하고 그 때문에, 내가 루프 후에 보내 싶어 변수가 비어있는 경우 어떤 이유

디버깅 그림. 어떻게 해결할 수 있습니까? 코드는 항상 맨 위에서 아래로 읽는다고 생각했습니다. 끝에

이 목록은해야 모든 것을 포함하지만 문이 두 번째로 호출되고 있지 않은 경우 ...

 public static void GetAllFiles(string sDir) 
    { 
     List <string> datas = new List<string>(); 
     foreach (string dir in Directory.GetDirectories(sDir)) 
     { 
      try 
      { 
       foreach (string file in Directory.GetFiles(dir, "*text.txt")) 
       { 
        string var = File.ReadAllText(file); 
        datas.Add(var); 
       } 
       GetAllFiles(dir); 
      } 
      catch 
      { 
      } 
     } 
     if (datas != null) 
     { 
      string dets = String.Join("\n\n", datas.ToArray()); 
      sendmm(dets); 
     } 
    } 

APPDATA 디렉토리가 전달되는 귀하의 방법 GetAllFiles 자체를 호출

+0

텍스트 편집기의 스크린 샷은 실제 코드를 질문 편집기에 붙여 넣기위한 매우 불량한 대체품입니다. –

+1

코드를 붙여 넣으면 볼 수 있으므로 도움이 될 것입니다. – Ma3x

+0

편집 됨, 미안합니다 – Fightera100

답변

0

이 작업을 수행하는 가장 쉬운 방법은 다른 목적으로 재귀가 필요합니다.

List <string> datas = new List<string>(); 

public static void GetAllFiles(string sDir) 
{  datas = new List<string>(); 
     datas.AddRange(Directory.GetFiles(sDir); 
    foreach (string dir in Directory.GetDirectories(sDir)) 
    { 
     recursiveSearch();   
    } 
    if (datas != null) 
    { 
     string dets = String.Join("\n\n", datas.ToArray()); 
     sendmm(dets); 
    } 
} 
private string recursiveSearch(string dir) 
{ 
    datas.AddRange(Directory.GetFiles(dir)); 
    foreach(string directory in dir.GetDirectories()) 
    { 
     recursiveSearch(directory); 
    } 
} 
1

foreach 루프 안에 있고 목록의 시작 부분에 리셋하면 블록 뒤에 빈 datas 목록이 표시됩니다.

디버깅 그림의 위치가 Directory.GetDirectories(sDir) 호출이 더 이상 어떤 디렉토리도 반환하지 않는 두 번째 (또는 더 깊은) GetAllFiles 호출 내에 있습니다. 이미 디렉토리가없는 하위 디렉토리 안에 있습니다.

IDE에서 Call Stack 창이 열리고 스택을 위아래로 클릭하면 더 잘 이해할 수 있습니다. 스택에 적어도 두 개의 GetAllFiles 항목이 표시되어야합니다. 이들을 클릭하고 datas 목록 및 기타 로컬 변수를 검사하십시오. 재귀에 대한 필요가 없습니다

public static void GetAllFiles(string sDir) 
{ 
    Console.WriteLine(String.Join("\n\n",Directory.GetFiles(sDir, "*.*", SearchOption.AllDirectories))); 
} 

-하지만 당신은 귀하의 질문에 재귀를 사용하기 때문에, 당신은 간단하게 할 수있다, 이것은 당신이 경우에 그것을 사용하십시오 방법은 다음과 같습니다

관련 문제