검색 옵션을 사용하는 방법이 있습니까 : 모든 디렉토리이지만 폴더의 첫 번째 레이어를 검색 한 후 다음 폴더로 건너 뜁니다.

LeoX

여러 하위 디렉터리 가있는 매우 큰 폴더가 있는데 찾으려는 파일 은 해당 하위 디렉터리 첫 번째 레이어 에만 있습니다. 시도 SearchOption.AllDirectories했지만 시간이 너무 많이 걸립니다. 함수가 전체 하위 디렉토리를 검색하지 않고 첫 번째 계층검색하는 방법 이 있습니까?

나는 사용해 Directory.EnumerateFiles보았지만 여전히 너무 많은 시간 이 걸립니다 .

foreach (string file in Directory.EnumerateFiles(
   @"\\Computer1\", 
    "Application.exe", 
     SearchOption.AllDirectories)) {
  ...
}
드미트리 비 첸코

중첩 된 쿼리 를 시도 할 수 있습니다 .

  1. 상위 디렉토리 열거@"\\Computer1\"
  2. 다음 최상위 디렉토리에있는 파일을 열거 합니다 .

암호:

using System.IO;
using System.Linq;

...

var files = Directory
  .EnumerateDirectories( @"\\Computer1\", "*", SearchOption.TopDirectoryOnly)
  .SelectMany(dir => Directory
     .EnumerateFiles(dir, "Application.exe", SearchOption.TopDirectoryOnly)); 

foreach (var file in files) {
...
}

편집 : 1 단계 및 2 단계 파일을 열거하려면 쿼리를 한 번 더 중첩 할 수 있습니다 .

var files = Directory
  .EnumerateDirectories( @"\\Computer1\", "*", SearchOption.TopDirectoryOnly)
  .SelectMany(dir => Directory
      // 1st level
     .EnumerateFiles(dir, "Application.exe", SearchOption.TopDirectoryOnly)
      // 2nd level
     .Concat(Directory
       .EnumerateDirectories(dir, "*", SearchOption.TopDirectoryOnly)
       .SelectMany(subdir => Directory.EnumerateFiles(subdir, "Application.exe", SearchOption.TopDirectoryOnly)))); 

일반적 으로 우리는

private static IEnumerable<string> EnumerateDirectories(string root, int level) {
  int current = 0;

  Queue<string> agenda = new Queue<string>();

  agenda.Enqueue(root);

  while (current <= level) {
    var list = agenda.ToList();

    agenda.Clear();

    foreach (var dir in list) {
      if (current > 0)
        yield return dir;

      if (current < level)
        foreach (var subdir in Directory.EnumerateDirectories(dir))
          agenda.Enqueue(subdir);
    }

    current += 1;
  }
}

사용 :

// All subdirectories, up and including 2nd level
var files = EnumerateDirectories(@"\\Computer1\", 2)
  .SelectMany(dir => Directory
     .EnumerateFiles(dir, "Application.exe", SearchOption.TopDirectoryOnly));

foreach (var file in files) {
  ...
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관