2012-08-07 4 views
2

지정한 폴더의 하위 디렉터리 (MyFolder라고 부름)에서 파일을 찾고 하위 디렉터리를 다른 위치에서 사용할 문자열 변수에 저장하려고합니다. 문제는 지정된 폴더에 여러 개의 하위 디렉토리가있을 수 있으며 각 하위 디렉토리에는 하위 디렉토리가있을 수 있다는 것입니다. MyFolder 아래에있는 트리의 하위 디렉토리 중 하나만 내가 원하는 파일을 가지고 있습니다.SubDir을 문자열 반환 형식으로 가져 오기

아래 예제에서 두 위치 중 하나에있을 수 있지만 (이 예에서는 두 위치 모두 가능하지만 둘 다있을 수 없음)

-Root  
--/MyFolder  
---/a  
-----/aa  
-------------/blah.txt (or if not here, it may be...)  
---/b  
-------/blah.txt (...right here, possibly) 

나는 물론, blah.txt를 찾기 위해 노력하고있어.

루프는 다음과 같이 반복적으로 foreach 루프를 만들었지 만 파일이 서브 디렉토리 (/a, or /b)의 첫 번째 레벨에서 발견되는 경우에만 하위 디렉토리 만 반환합니다. 파일이 /aa or /bb 또는 그보다 깊은 경우 (예 : root/a/aa/aaa,) NULL을 반환합니다. 나는 디버거를 천천히 걷고 지역 주민들의 창문을 자세히 보면서 몇 시간을 보냈지만, 무엇이 잘못되었는지를 알 수는 없다. 두 번째 foreach 루프에있는 동안 파일을 찾고 올바른 하위 디렉토리 경로를 저장하지만 어떤 이유로 든 역순으로 루프를 시작합니다 (이전 디렉토리가 return "Null";에 도달 할 때까지 표시). 파일이 하위 수준의 하위 수준에서 발견 된 경우에만 하위 수준의 하위 수준에서 발견 된 경우에만 발생합니다. 당신은 할 수 문자열 (어쩌면 다른 기능에 의해) 다른 곳에서 사용되는 같은 경로를 저장하려고하지 않는,하지만 표시해야하는 경우

class Program 
{ 
    static string dir = @"C:\MyFolder\"; 

    static void Main(string[] args) 
    { 
     Console.WriteLine(GetDirectory(dir)); 
     Console.ReadKey(); 
    } 

    static string GetDirectory(string dir) 
    { 
     foreach (string dName in Directory.GetDirectories(dir)) 
     { 
      foreach (string fName in Directory.GetFiles(dName, "blah.txt")) 
      { 
       return dName; 
      } 
      GetDirectory(dName); 
     } 
     return "NULL"; 
    } 
} 

나는이 작품 같은 것을 본 적이있는 유일한 방법은 콘솔에서와 같이 void 반환 유형으로 즉시 반환합니다 (반환을 "Console.WriteLine(dName)"으로 변경하고 함수 호출을 적절히 수정하여).

저는 C#에 익숙하지 않습니다. 코딩 경험은 이전에 JavaScript 및 AutoHotkey에 있었기 때문에 이와 같은 언어에 대한 지식은 여전히 ​​극히 제한되어 있으며, 모두 제가 C 초보자 가이드 북입니다. 인터넷을 통해 읽었습니다 ... 그리고 나는이 특정 문제에 대해 아무런 도움도없이 용감하게 조사했습니다. 그래서 그 어떤 도움이나 조언도 대단히 감사하겠습니다!

답변

6

재귀 검색이 내장되어 있지 않은 이유는 무엇입니까?

Directory.GetFiles(@"C:\MyFolder\", "blah.txt", SearchOption.AllDirectories) 

같은

뭔가 Directory.GetFiles Method (String, String, SearchOption)SearchOption Enumeration

심지어 DirectoryInfo에서보세요.

뭔가

new DirectoryInfo(@"C:\MyFolder\").GetFiles("blah.txt", SearchOption.AllDirectories) 
+0

그건 너무 지나치게 쉬웠고 멋졌습니다. 단지 SearchOption 매개 변수를 인식하지 못했습니다. 특히 원본 제안에 대한 링크 및 추가 사항에 대해 감사드립니다. 대단히 감사합니다! – TheArtofX

1
같은 디렉토리 루프 전에로 파일 루프를 이동

. dName 대신 dir으로 return을 변경하십시오.

+0

아무리 노력해도 작동하지 않을 수 있습니다. 파일 루프를 처음으로 설정하면 항상 NULL이 반환됩니다. 다른 사용자가 질문에 답변했지만 답장을 보내 주셔서 감사합니다. – TheArtofX

1

간단히 첫 번째 검색을 수행하는 방법은 Directory.EnumerateFiles()일까요?

var fileToSearch = "blah.txt"; 
var matchingFile = Directory.EnumerateFiles(dir, fileToSearch, SearchOption.AllDirectories) 
           .FirstOrDefault(); 

if(matchingFile != null) 
{ 
    Console.WriteLine("File found: " + matchingFile); 
} 
else 
{ 
    Console.WriteLine("Could nowhere below \"" + dir + "\" find the file \"" + fileToSearch + "\"."); 
} 
+0

이것은 잘 작동했지만 위의 대답은 내가 제시 한 특정 인스턴스에 대해 코드에 따라 훨씬 간단했습니다. 필자는이 방법을 파일을 찾는 데 가장 잘 알고 있었기 때문에 응답은 대단히 감사하게 생각합니다! – TheArtofX

관련 문제