CodeGym /행동 /C# SELF /디렉터리 생성 및 삭제 ( Directory

디렉터리 생성 및 삭제 ( Directory)

C# SELF
레벨 40 , 레슨 1
사용 가능

1. 소개

사용자가 사진을 업로드하는 프로그램을 만든다고 상상해보자. 파일들을 그냥 한 폴더에 막 쌓아두기보다는 날짜별이나 사용자별로 디렉터리를 만들어 관리하는 게 좋다. 또는 프로그램이 리포트를 생성한다면 결과를 전용 디렉터리에 모아두는 게 합리적이다(런타임에 디렉터리를 만들어야 함). 작업 후 임시 폴더를 삭제하는 것도 깔끔한 코드라면 필수다(사용자에게도 유리하고).

디렉터리 작업은 백업부터 게임의 세이브 관리까지 많은 애플리케이션에서 흔히 하는 일이다. 면접에서도 자주 나오는데, 단순히 "만들기"나 "삭제"를 아는 것뿐 아니라 예외 상황에서 어떻게 동작하는지를 이해하는 게 중요하다.

디렉터리(또는 폴더)는 파일 시스템에서 다른 파일과 디렉터리를 담는 컨테이너다. 디렉터리들은 트리 구조(filesystem tree)를 형성한다: 최상위(루트)를 제외하면 각 폴더는 부모가 있고, 수많은 자식 폴더를 가질 수 있다.

2. 폴더를 어떻게 만들까? 정적 클래스 Directory

가장 간단한 방법은 정적 메서드 Directory.CreateDirectory를 사용하는 것이다. 객체를 만들 필요 없이 경로만 넘기면 된다:

using System.IO;

// 현재 디렉터리에 "Reports" 폴더 생성
Directory.CreateDirectory("Reports");

이미 같은 폴더가 있어도 메서드는 아무 동작을 하지 않고 예외를 던지지 않는다 — CreateDirectory를 존재 여부를 신경 쓰지 않고 안전하게 호출할 수 있다.

좀 더 복잡한 경로를 넣어 보자 — 예를 들어 중첩된 폴더를 만들어 보자:

Directory.CreateDirectory(@"Data\Photos\2024\June");

이 호출은 중간 폴더가 없으면 전체 디렉터리 체인을 만들어 준다. 이를 재귀적 생성이라고 하며, Directory.CreateDirectory가 알아서 처리해 준다.

중요! 경로를 지정할 때는 Windows에서는 이스케이프된 역슬래시(\\) 또는 슬래시(/)를 사용하라. 더 좋은 방법은 이전에 다뤘던 Path.Combine을 쓰는 것이다.

CreateDirectory는 무엇을 반환하나?

이 메서드는 DirectoryInfo 타입의 객체를 반환한다. 생성한 디렉터리로 바로 작업하려면 편리하다:

DirectoryInfo reportsDir = Directory.CreateDirectory("Reports");
Console.WriteLine($"폴더 생성됨: {reportsDir.FullName}");

폴더가 존재하는지 어떻게 알지?

디렉터리에 작업을 하기 전에는 존재 여부를 확인하는 것이 좋다. 이를 위한 정적 메서드가 있다:

bool exists = Directory.Exists("Reports");
if (!exists)
{
    Console.WriteLine("폴더를 찾을 수 없어서 지금 만들게요!");
    Directory.CreateDirectory("Reports");
}

메모: 만들기 전에 반드시 확인할 필요는 없다: 폴더가 있어도 메서드는 문제를 일으키지 않는다. 그러나 사용자에게 알림을 주거나 다른 로직을 실행하려면 이런 확인이 유용하다.

3. 디렉터리 생성: 실전 케이스

이 지식을 학습용 앱에 적용해보자. 예를 들어 사용자별로 폴더를 만들어 데이터를 저장한다고 하자:

// 파일 상단에 System.IO를 추가하세요(없다면)
using System.IO;

Console.Write("사용자 이름 입력: ");
string userName = Console.ReadLine() ?? "Unknown";

// 사용자 폴더 경로 조립
string basePath = "UsersData";
string userPath = Path.Combine(basePath, userName);

// 사용자 폴더(및 부모 폴더) 생성
Directory.CreateDirectory(userPath);

Console.WriteLine($"사용자 \"{userName}\" 폴더 준비됨: {Path.GetFullPath(userPath)}");

위 예시는 다음과 같은 파일 구조를 생성할 것이다(없던 경우):


UsersData/
  └── 사용자이름/

조언: 경로 조합할 때는 항상 Path.Combine을 사용하라 — 그러면 코드가 Windows와 Linux/Mac에서 모두 잘 동작한다.

4. 폴더를 어떻게 삭제할까? 메서드 Directory.Delete

폴더 삭제는 생성만큼 간단하지만 몇 가지 주의할 점이 있다.

Directory.Delete("Reports");

폴더가 존재하고 비어있다면 문제없이 삭제된다. 하지만 폴더 안에 무언가 들어있다면 예외가 발생한다:
System.IO.IOException: "The directory is not empty."

내용이 있는 폴더를 삭제하려면?

이럴 때는 오버로드된 메서드를 사용한다 — recursive: true 파라미터가 있다:

Directory.Delete("Reports", recursive: true);

경고: Recursive 삭제는 폴더 내부의 모든 것을 되돌릴 수 없이 지운다. 실수로 잘못된 경로를 지정하면 중요한 데이터를 잃을 수 있으니 항상 경로를 두 번 확인하라!

예제

사용자가 계정을 삭제할 때 그 사용자의 폴더를 지우는 기능을 추가해보자:

// 삭제할지 물어보기
Console.Write("사용자 폴더를 삭제할까요? (y/n): ");
string input = Console.ReadLine() ?? "";

if (input.ToLower() == "y")
{
    if (Directory.Exists(userPath))
    {
        // 내부 내용까지 전부 삭제
        Directory.Delete(userPath, recursive: true);
        Console.WriteLine("사용자 폴더가 삭제되었습니다!");
    }
    else
    {
        Console.WriteLine("폴더가 이미 존재하지 않습니다.");
    }
}

5. 표: 폴더 작업의 주요 메서드

작업 메서드 특징
폴더 생성
Directory.CreateDirectory(path)
경로에 있는 모든 폴더를 재귀적으로 생성함
존재 확인
Directory.Exists(path)
true 또는 false 반환
빈 폴더 삭제
Directory.Delete(path)
폴더가 비어있지 않으면 예외 던짐
내용 포함 폴더 삭제
Directory.Delete(path, recursive: true)
내부의 모든 것을 되돌릴 수 없이 삭제함
파일 목록 얻기
Directory.GetFiles(path)
파일 이름 목록 반환
하위 폴더 목록 얻기
Directory.GetDirectories(path)
디렉터리 이름 목록 반환

6. 눈치채기 힘든 점들과 흔한 실수

생성 시 오류: 권한 없거나 경로가 잘못된 경우

시스템 디렉터리(예: "C:\Windows\System32\SuperApp")에 폴더를 만들려고 하면 보통 UnauthorizedAccessException이나 IOException 예외를 받는다.

유용한 팁:

외부 드라이브(예: 사용자의 USB나 네트워크 드라이브)와 작업할 때는 항상 try-catch로 예외를 처리하라.

사용자가 입력한 경로를 바로 신뢰하면 안 된다.

try
{
    Directory.CreateDirectory(pathFromUser);
}
catch (Exception ex)
{
    Console.WriteLine($"폴더를 만들 수 없습니다: {ex.Message}");
}

다른 프로세스가 사용 중이라 삭제할 수 없는 경우

누군가(또는 같은 프로그램의 다른 부분)가 폴더 내 파일을 열어두고 있으면 폴더 삭제 시 IOException이 발생한다 — 먼저 폴더 안의 모든 파일을 닫아야 한다.

폴더가 비어있지 않은데 recursive: true를 깜빡한 경우

매우 흔한 실수다. recursive: true를 전달하지 않으면 폴더가 비어있지 않을 때 예외가 발생한다.

중요 작업에는 절대 경로를 사용하라

상대 경로("Reports")는 항상 애플리케이션의 현재 작업 디렉터리를 기준으로 동작한다. 다른 위치에서 프로그램을 실행하면 폴더가 예상과 다른 곳에 생성될 수 있다. 코드가 어디서 실행되는지 확인하거나 바로 절대 경로를 지정하라:

string fullPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "MyAppData");
Directory.CreateDirectory(fullPath);
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION