
C#에서 디렉터리를 복사하기 위해 재귀 함수를 직접 만들었던 것, 기억하시나요?
"C#은 왜 한 번에 처리하는 메서드를 제공하지 않을까?"하는 아쉬움이 남으셨을지도 모릅니다.
사실, 방법이 있습니다! 마치 무거운 책들을 한 번에 옮겨주는 '마법의 손수레'처럼,
디렉터리 복사를 아주 간단하게 처리해 주는 기능이 .NET 프레임워크 안에 숨어있답니다.
이번 글에서는 Microsoft.VisualBasic라이브러리를 활용하여
디렉터리를 단 한 줄의 코드로 복사하는 방법을 알아보겠습니다.
"잠깐만요, 저희는 C#을 하고 있는데 갑자기 Visual Basic이라니요?"
결론부터 말하면, 아무 문제 없습니다. Microsoft.VisualBasic.dll은
C#과 마찬가지로 .NET에서 제공되는 표준 라이브러리입니다.
.NET 생태계 안에서는 어떤 언어에서든 참조해서 사용할 수 있습니다.
특히 파일 시스템 처리, 금융 관련 함수, 레지스트리 접근 등에서
C#의 기본 라이브러리가 제공하지 않는 편리한 유틸리티성 기능들을 포함하고 있어,
VB.NET에서 제공하는 특정 기능들을 C# 프로젝트 내에서 활용할 수 있습니다.
먼저 Microsoft.VisualBasic라이브러리를 사용하려면 프로젝트에 추가해야 합니다.
프로젝트 타입에 따라 방법이 달라요!
- .NET Framework 프로젝트:
Microsoft.VisualBasic을 사용하려면 직접 참조를 추가해야 합니다.- .NET Core 2.0+ / .NET 5.0+ 프로젝트:
최신 .NET 환경에서는 NuGet 패키지로 관리됩니다.
[NuGet 패키지 관리자]에서Microsoft.VisualBasic을 검색하여 설치하면 됩니다.
혹은 [패키지 콘솔 창]에서Install-Package Microsoft.VisualBasic을 입력합니다.
이제 모든 준비는 끝났습니다. 복잡한 재귀 호출(Recursive Call)을 만드는 대신
FileSystem.CopyDirectory()메서드 하나면 모든 것이 간단하게 해결됩니다.
[코드]
using System;
using System.IO;
using Microsoft.VisualBasic.FileIO; // <-- 디렉터리 복사를 간단하게 처리해주는 마법의 손수레
// --- 테스트 환경 구성 ---
string sourceDir = @"C:\Temp\SourceProject";
string destDir = @"C:\Temp\BackupProject";
// 기존 폴더가 있다면 삭제 후 새로 생성
if (Directory.Exists(sourceDir)) Directory.Delete(sourceDir, true);
if (Directory.Exists(destDir)) Directory.Delete(destDir, true);
Directory.CreateDirectory(sourceDir);
Directory.CreateDirectory(Path.Combine(sourceDir, "data")); // 하위 폴더 생성
File.WriteAllText(Path.Combine(sourceDir, "README.md"), "원본 파일");
File.WriteAllText(Path.Combine(sourceDir, "data", "config.json"), "{}");
Console.WriteLine("테스트 환경이 구성되었습니다.");
// --- 테스트 환경 구성 끝 ---
Console.WriteLine("아무 키나 누르면 디렉터리가 복사됩니다.");
Console.ReadKey();
Console.WriteLine("디렉터리 복사를 시작합니다...");
try
{
FileSystem.CopyDirectory(sourceDir, destDir, true);
Console.WriteLine("디렉터리 복사가 완료되었습니다!");
}
catch (Exception ex)
{
Console.WriteLine($"복사 중 오류 발생: {ex.Message}");
}
[실행 결과]
테스트 환경이 구성되었습니다.
아무 키나 누르면 디렉터리가 복사됩니다.
디렉터리 복사를 시작합니다...
디렉터리 복사가 완료되었습니다!
FileSystem.CopyDirectory(원본 경로, 대상 경로, 덮어쓰기 여부);
원본 경로: 복사할 원본 폴더 경로입니다.대상 경로: 붙여넣을 대상 폴더 경로입니다. 폴더가 존재하지 않으면 알아서 생성합니다.덮어쓰기 여부: 세 번째 인자는 덮어쓰기 여부를 결정하는 bool값입니다.true로 설정하면 대상 위치에 같은 이름의 파일이 있을 경우 덮어씁니다.false일 경우, 중복 파일이 있으면 System.IO.IOException이 발생합니다.이 메서드 하나가 내부적으로 모든 복잡한 작업을 알아서 처리해 줍니다.
그렇다면 재귀 함수 구현과 VB.NET을 사용하는 것 중 언제 어떤 것을 써야 할까요?
| 구분 | 직접 구현 (재귀 호출) | VB.NET |
|---|---|---|
| 장점 | 외부 라이브러리 의존성 없음 특정 파일 복사, 특정 폴더를 제외하는 등 세밀한 제어 | 코드가 매우 간결하고 직관적임 Microsoft에서 제공하는 안정적이고 최적화된 로직 |
| 단점 | 코드가 길고 복잡하며, 예외 처리를 꼼꼼히 해야 함 코드 작성 시 실수할 여지가 있음 | Microsoft.VisualBasic 참조 필요단순 전체 복사 외의 복잡한 조건 처리 불가 |
| 추천 상황 | ".log 파일은 제외하고 복사해주세요!"와 같이커스텀 로직이 필요할 때 | 폴더 전체를 그대로 복사하는 단순하고 빠른 작업이 필요할 때 |
C#의 기본 라이브러리를 넘어, Microsoft.VisualBasic이라는
'마법의 손수레'를 활용해 디렉터리 복사 작업을 단 한 줄로 처리하는 방법을 배웠습니다.
가끔은 이렇게 다른 도구 상자에 담긴 멋진 연장을 빌려 쓰는 지혜도 필요하답니다.