여러 하위 디렉터리 가있는 매우 큰 폴더가 있는데 찾으려는 파일 은 해당 하위 디렉터리 의 첫 번째 레이어 에만 있습니다. 시도 SearchOption.AllDirectories
했지만 시간이 너무 많이 걸립니다. 함수가 전체 하위 디렉토리를 검색하지 않고 첫 번째 계층 만 검색하는 방법 이 있습니까?
나는 사용해 Directory.EnumerateFiles
보았지만 여전히 너무 많은 시간 이 걸립니다 .
foreach (string file in Directory.EnumerateFiles(
@"\\Computer1\",
"Application.exe",
SearchOption.AllDirectories)) {
...
}
중첩 된 쿼리 를 시도 할 수 있습니다 .
@"\\Computer1\"
암호:
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] 삭제
몇 마디 만하겠습니다