흠, 나는 그 질문을 오해하고 있다고 생각하지만 나는 그것을 위험에 빠뜨릴 것이다. 다음과 같은 간단한 방법으로 무엇이 잘못 되었습니까?
public static void CopyFilesRecursively(DirectoryInfo source, DirectoryInfo target) {
foreach (DirectoryInfo dir in source.GetDirectories())
CopyFilesRecursively(dir, target.CreateSubdirectory(dir.Name));
foreach (FileInfo file in source.GetFiles())
file.CopyTo(Path.Combine(target.FullName, file.Name));
}
편집 이 게시물에 똑같이 간단한 질문에 대한 간단한 대답에 대한 인상적인 수의 다운 보트가 생겼으므로 설명을 추가하겠습니다. 제발 downvoting 전에 반드시 숙지 .
우선, 이 코드는 문제의 코드를 대체 하는 것으로 의도 된 것은 아닙니다 . 설명을 위해서만 사용하십시오.
Microsoft.VisualBasic.Devices.Computer.FileSystem.CopyDirectory
이 답변에서 누락 된 몇 가지 추가 정확성 테스트 (예 : 소스 및 대상이 유효한 디렉토리인지, 소스가 대상의 부모인지 등)를 수행합니다. 이 코드는 아마도 더 최적화되었을 것입니다.
즉, 코드 가 잘 작동합니다 . 그것은 한 (거의 동일) 년 동안 성숙한 소프트웨어에 사용되었습니다. 모든 IO 처리에 따른 고유 한 결함 (예를 들어 코드를 작성하는 동안 사용자가 USB 드라이브를 수동으로 분리하면 어떻게됩니까?) 외에 알려진 문제는 없습니다.
특히, 여기서 재귀를 사용하는 것이 문제가되지 않는다는 것을 지적하고 싶습니다. 이론적으로 (개념적으로 가장 우아한 솔루션 임) 또는 실제로 는 아닙니다 . 이 코드는 스택을 오버플로하지 않습니다 . 스택은 깊이 중첩 된 파일 계층 구조를 처리 할 수있을만큼 충분히 큽니다. 스택 공간이 문제가되기 훨씬 전에 폴더 경로 길이 제한이 시작됩니다.
• 그래도주의 악의적 인 사용자가 하나 개의 문자 각각의 깊게 중첩 된 디렉토리를 사용하여이 가정을 파괴 할 수 있습니다. 나는 이것을 시도하지 않았습니다. 그러나 요점을 설명하기 위해 :이 코드를 일반적인 컴퓨터에서 오버플로하려면 디렉토리를 수천 번 중첩해야합니다 . 이것은 단순히 현실적인 시나리오가 아닙니다.