C#에서 디렉터리의 전체 내용을 복사할 때 가장 중요한 것은 하위 디렉터리와 그 안에 들어 있는 파일들까지 빠짐없이 복사하는 것입니다. 최상위 폴더만 복사하면 원본의 구조가 유지되지 않기 때문에, DirectoryInfo 클래스와 재귀 호출을 활용하는 방법이 일반적으로 사용됩니다.
예제 시나리오
먼저 아래와 같이 여러 개의 하위 디렉터리와 파일이 들어 있는 데모 소스 디렉터리(d:\DemoSourceDirectory)가 있다고 가정해 보겠습니다.

그리고 복사 대상이 될 데모 타깃 디렉터리(d:\DemoTargetDirectory)는 처음에는 비어 있는 상태입니다.

다음 예제 코드는 소스 디렉터리의 모든 파일과 하위 디렉터리를 타깃 디렉터리로 그대로 복사합니다.
using System;
using System.IO;
namespace DemoApplication {
class Program {
public static void Main() {
string sourceDirectory = @"d:\DemoSourceDirectory";
string targetDirectory = @"d:\DemoTargetDirectory";
DirectoryInfo sourceDircetory = new DirectoryInfo(sourceDirectory);
DirectoryInfo targetDircetory = new DirectoryInfo(targetDirectory);
CopyAll(sourceDircetory, targetDircetory);
Console.ReadLine();
}
public static void CopyAll(DirectoryInfo source, DirectoryInfo target) {
Directory.CreateDirectory(target.FullName);
foreach (FileInfo fi in source.GetFiles()) {
Console.WriteLine(@"Copying {0}\{1}", target.FullName, fi.Name);
fi.CopyTo(Path.Combine(target.FullName, fi.Name), true);
}
foreach (DirectoryInfo diSourceSubDir in source.GetDirectories()) {
DirectoryInfo nextTargetSubDir =
target.CreateSubdirectory(diSourceSubDir.Name);
CopyAll(diSourceSubDir, nextTargetSubDir);
}
}
}
}
코드 핵심 로직
- 대상 디렉터리 생성: CopyAll 메서드가 시작되면 Directory.CreateDirectory(target.FullName)를 통해 타깃 경로가 없을 경우 자동으로 생성합니다.
- 파일 복사: GetFiles()로 현재 디렉터리의 모든 파일을 가져온 뒤, CopyTo(Path.Combine(target.FullName, fi.Name), true)를 호출해 기존 파일이 있으면 덮어쓰면서 복사합니다.
- 재귀 처리: GetDirectories()로 하위 디렉터리를 하나씩 순회하고, CreateSubdirectory로 같은 이름의 하위 디렉터리를 만든 다음 CopyAll을 다시 호출하여 몇 단계든 깊은 폴더 구조까지 모두 복사합니다.
실행 결과
위 코드를 실행하면 콘솔에 복사되는 파일 경로가 출력되고, 소스 디렉터리의 파일과 하위 디렉터리가 타깃 디렉터리에 그대로 복사된 것을 확인할 수 있습니다.

