모든 예제는 파일을 하위 디렉토리에있는 파일을 재귀 적으로 가져 오는 것만 보이는 것처럼 보입니다. 내가 뭘 하려는지 "xxx"라는 특정 하위 디렉토리에 대한 폴더를 검색 다음 다른 것들을 위해 사용할 수 있도록 변수에 그 경로를 저장합니다.C# 하위 디렉토리 검색 (파일 제외)
모든 디렉토리를 반복하고 이름을 비교하지 않고도이 작업을 수행 할 수 있습니까?
모든 예제는 파일을 하위 디렉토리에있는 파일을 재귀 적으로 가져 오는 것만 보이는 것처럼 보입니다. 내가 뭘 하려는지 "xxx"라는 특정 하위 디렉토리에 대한 폴더를 검색 다음 다른 것들을 위해 사용할 수 있도록 변수에 그 경로를 저장합니다.C# 하위 디렉토리 검색 (파일 제외)
모든 디렉토리를 반복하고 이름을 비교하지 않고도이 작업을 수행 할 수 있습니까?
잘
Directory.GetDirectories(root);
당신에게 서브 디렉토리의 배열을 반환합니다 여기에서 자세한 내용입니다.
그런 다음 당신이 관심있는 일을 찾기 위해 Linq를 사용할 수 있습니다 : 코드에서 루프 아니지만, 그럼에도 불구하고 여전히 루프
IEnumerable<string> list = Directory.GetDirectories(root).Where(s => s.Equals("test"));
합니다. 따라서 궁극적 인 대답은 "반복하지 않고 폴더 '테스트'를 찾을 수 없다는 것입니다.
Linq에 .SingleOrDefault()
을 추가 할 수 있지만 "test"폴더를 찾을 수없는 경우 수행하려는 작업에 따라 다릅니다.
GetDirectories
호출에 SearchOption SearchOption.AllDirectories
을 포함하도록 변경하면 재귀도 수행됩니다. 분명히이 경우 호출은 디렉토리 트리에 "test"라는 폴더가 두 개 이상있는 경우 둘 이상의 항목을 반환 할 수 있습니다.
예, 제 3 자 라이브러리가 부족한 유일한 해결책은 이름 비교를 통해 디렉토리를 재귀 적으로 검색하는 것입니다.
.Net 용 api도 제공하는 Windows Search를 사용할 수 있습니다. Windows Search 4.0 for Developers
우선 "모든 디렉토리를 반복하고 이름을 비교하지 않고는 불가능합니다."
저는 실제 질문은 "모든 디렉토리를 반복하면서 이름을 비교하여 처리하는 기존 API가 있습니까?"라고 생각합니다.
예, 있습니다. Directory.Exists()
라고 :
var xxxPath = Path.Combine(parentFolder, "xxx");
if (Directory.Exists(xxxPath))
savedPath = xxxPath;
var foldersFound = Directory.GetDirectories(root, "test", SearchOption.AllDirectories)
이 주어진 이름을 발견 모든 폴더와 문자열 배열을 반환합니다. 마지막 매개 변수를 변경하여 최상위 디렉토리 만 검사하고 루트를 변경하여 시작 위치를 조정할 수 있습니다.
public static string FindGitPath(string firstFilter, string secondFilter, string initialPath)
{
string gitPath = string.Empty;
foreach (var i in Directory.GetDirectories(initialPath)) {
try {
foreach (var f in Directory.GetDirectories(i, firstFilter, SearchOption.AllDirectories)) {
foreach (var s in Directory.GetDirectories(f)) {
if (s == Path.Combine(f,secondFilter)) {
gitPath = f;
break;
}
}
}
} catch (UnauthorizedAccessException) {
Console.WriteLine("Path is not accessible: {0}", i);
}
}
return gitPath;
}
사용 예 :
Console.WriteLine("Retrieved the git database folder as {0}", FindGitPath("database",".git", "c:\\"));
+1 여기 –
@David - 실제로 하위 디렉토리를 찾을 수없는 경우 아무 것도 반환하지 않을 수도 있습니다. 내 대답을 업데이트 할게. – ChrisF
@ChrisF, 예 "..OrDefault "는 일치하는 항목이없는 경우 null을 반환한다는 것을 의미합니다. 내가 말한 내용에서 미묘한 부분을 놓치지 않는 한 :-( –