2009-01-13 4 views
19

partuicular 파일 형식 (.xml, .csv, .xls와 같은 확장자)에 대해 드라이브 (C :, D : 등)를 검색해야합니다. 재귀 검색을 수행하여 모든 디렉토리와 내부 디렉토리를 반복하고 파일이있는 전체 경로를 반환하려면 어떻게합니까? 또는 이것에 대한 정보를 어디에서 얻을 수 있습니까?재귀 파일 검색 .net에서

VB.NET 또는 C#

감사

편집 ~ 내가 좋아하는 몇 가지 오류로 실행하고 나는 파일을 구현하는 몇 가지 smaple 코드를 볼 수있는 등 누구나 알고 있나요가 거부 시스템 볼륨 액세스에 액세스 할 수 없습니다 수색? 난 단지 선택한 드라이브를 검색하고 발견 된 모든 파일에 대한 파일 형식의 전체 경로를 반환해야합니다.

답변

20

어때? 그것은 종종 내장 된 재귀 적 검색에 의해 던져지는 예외를 피합니다 (즉, 단일 폴더에 대한 액세스가 거부되어 전체 검색이 종료 됨). lazily 평가됩니다 (즉, 결과가 발견 되 자마자 반환됩니다. 2000 개의 결과를 버퍼링). 게으른 동작을 통해 응답 성있는 UI 등을 구축 할 수 있으며 LINQ (특히 First(), Take() 등)에서도 잘 작동합니다.

그것은 recls 도서관과 같은
using System; 
using System.Collections; 
using System.Collections.Generic; 
using System.IO; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach (string match in Search("c:\\", "*.xml")) { 
      Console.WriteLine(match); 
     } 
    } 
    static IEnumerable<string> Search(string root, string searchPattern) { 
     Queue<string> dirs = new Queue<string>(); 
     dirs.Enqueue(root); 
     while (dirs.Count > 0) { 
      string dir = dirs.Dequeue(); 

      // files 
      string[] paths = null; 
      try { 
       paths = Directory.GetFiles(dir, searchPattern); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string file in paths) { 
        yield return file; 
       } 
      } 

      // sub-directories 
      paths = null; 
      try { 
       paths = Directory.GetDirectories(dir); 
      } catch { } // swallow 

      if (paths != null && paths.Length > 0) { 
       foreach (string subDir in paths) { 
        dirs.Enqueue(subDir); 
       } 
      } 
     } 
    } 
} 
+0

흠 ... 방금 왜 파란 눈물에서 downvote있어? 이유를 설명하기 위해? –

+1

'catch {}'를 사용했을 수도 있습니다. 나는 기분을 상하게하려는 것이 아니지만 그것은 아주 나쁜 습관입니다. 더 나은 AccessDeniedException 또는 DirectoryNotFoudnException, 또는 무엇이든 잡으려고 ... HTH – JamieH

+0

Marc. 환상적입니다. –

52
System.IO.Directory.GetFiles(@"c:\", "*.xml", SearchOption.AllDirectories); 
+0

:

는 다음과 같이 사용된다. 단순하고 작동합니다. – NMunro

5

은 - 녹화 ursive LS의 약자 - 지금 pure .NET implementation 있습니다. 방금 read about it in Dr Dobb's입니다. 내가 원하는 정확히 무엇을

using Recls; 
using System; 
static class Program { // formatted for vertical space 
    static void Main() { 
     foreach(IEntry e in FileSearcher.Search(@"c:\", "*.xml|*.csv|*.xls")) { 
      Console.WriteLine(e.Path); 
     } 
    }