1. 소개
파일은 단순해 보이지만, 프로그램으로 파일을 생성하고 삭제하는 건 자동화와 유연성의 핵심이야. 예를 들어:
- 텍스트 에디터에서 사용자가 "저장"을 누르면 — 네 코드가 새로운 파일을 만들고 거기에 사용자의 작업을 쓴다.
- 이벤트 로깅 서비스는 앱 시작 시 자동으로 로그 파일을 생성한다.
- 압축기나 백업 유틸리티는 주기적으로 임시 파일을 만들었다가 지운다.
- C#으로 만든 게임은 자동 저장을 해서 save 파일을 생성하거나 덮어쓴다.
- 그리고 너(또는 스크립트)가 오래된 임시 파일들을 자동으로 정리해서 디스크를 지저분하지 않게 할 수 있다.
파일을 자동으로 생성하고 삭제할 줄 아는 건 현대 .NET 개발자에게 기본 중 하나야.
2. File을 통한 빠른 작업
파일 생성
C#에서 파일을 만드는 방법은 여러 가지야. 가장 빠르고 간단한 방법은 static 클래스 File을 사용하는 거야. 한 번 보자:
// 현재 디렉터리에 빈 파일 "myfile.txt" 생성
File.Create("myfile.txt").Close(); // FileStream은 닫아야 해!
Console.WriteLine("파일 'myfile.txt'이(가) 생성되었어.");
중요한 포인트:
메서드 File.Create는 FileStream 객체를 반환해. 이걸 닫아줘야( Close() ) OS가 "파일이 사용 중"이라고 경고하지 않아. 이걸 닫지 않으면 같은 파일에 대한 다른 작업들이 예기치 않게 실패할 수 있어. 흔한 상황이지: "파일이 다른 프로세스에 의해 사용 중", 근데 그 "다른 프로세스"가 사실은 바로 너의 프로그램일 때도 있어.
파일이 이미 존재하면, File.Create는 그 파일을 덮어써(기존 파일이 삭제되고 빈 새 파일이 생성돼). 파일이 없으면 새로 생겨.
빈 파일이 무슨 의미가 있을까?
대부분의 경우 새 파일은 빈 껍데기보다 뭔가를 기록하기 위해 필요해. 이럴 때 편한 메서드들이 있어:
File.WriteAllText("welcome.txt", "안녕, 파일 세계!");
이 명령은 파일을 만들고 그 안에 문자열을 쓰고, 파일을 깔끔하게 닫아줘. 문제가 생기지 않도록.
파일 존재 확인
새 파일을 만들기 전에, 혹시 이미 있는지 확인하는 게 좋아. 그렇지 않으면 중요한 걸 실수로 지울 수 있어.
if (!File.Exists("important.txt"))
{
File.WriteAllText("important.txt", "중요한 정보를 저장합니다.");
Console.WriteLine("파일 생성됨.");
}
else
{
Console.WriteLine("이미 그런 파일이 있어, 다른 걸 생각해 보자!");
}
3. 실전 예제: "사용자 환영 인사 저장"
Console.Write("이름을 입력하세요: ");
string name = Console.ReadLine();
string filename = $"{name}_greeting.txt";
string message = $"환영해, {name}!";
// 파일이 있는지 확인
if (!File.Exists(filename))
{
File.WriteAllText(filename, message);
Console.WriteLine($"개인 환영 파일 {filename}이(가) 생성되었어.");
}
else
{
Console.WriteLine($"파일 {filename}이(가) 이미 있어! 덮어쓸래? (y/n)");
string answer = Console.ReadLine();
if (answer?.ToLower() == "y")
{
File.WriteAllText(filename, message);
Console.WriteLine($"파일 {filename}이(가) 덮어써졌어.");
}
else
{
Console.WriteLine("그냥 그대로 둘게.");
}
}
우리가 여기서 하는 것들:
- 파일 존재 여부를 확인해 (File.Exists).
- 없으면 생성하고 텍스트를 써 (File.WriteAllText).
- 있으면 사용자에게 덮어쓸지 물어봐.
4. 파일 삭제
C#에서 파일 삭제는 거의 해킹 느낌이지만... 안전하게 할 수 있어! 방법도 간단해:
File.Delete 사용
File.Delete("myfile.txt");
파일이 없으면 — 드라마는 없어! 그냥 아무 일도 일어나지 않아(경로가 올바르면 예외가 발생하지 않아).
초보자용 함정
- 파일이 이미 너의 프로그램(또는 다른 프로그램)에 의해 열려 있으면 예외가 발생할 수 있어.
- 경로가 틀리면 ArgumentException이 나올 수 있어.
권장: 항상 존재 여부 확인
if (File.Exists("victim.txt"))
{
File.Delete("victim.txt");
Console.WriteLine("파일이 삭제되었어.");
}
else
{
Console.WriteLine("삭제할 게 없어 — 그런 파일이 없네.");
}
5. 폴더와 파일: 파일 구조 만들기
폴더 안에 파일 생성
string folder = "Data";
Directory.CreateDirectory(folder); // 폴더가 없으면 생성해 줘
string filename = Path.Combine(folder, "info.txt");
File.WriteAllText(filename, "여기에 비밀 메시지가 저장되어 있어!");
중요: 존재하지 않는 폴더에 파일을 만들려고 하면 예외가 날 수 있어. 그래서 먼저 Directory.CreateDirectory(folder)를 호출하는 게 맞아. 이미 폴더가 있으면 다시 만들지 않으니 안전해.
6. 인스턴스 방식: FileInfo
좀 더 '올드스쿨'이거나 조금 더 고급 시나리오에서는 FileInfo 클래스가 유용해:
FileInfo fi = new FileInfo("example.txt");
// 새 파일 생성 (File.Create처럼 빈 파일을 만듦)
using (var fs = fi.Create())
{
// 원하면 뭔가 쓸 수 있어
}
Console.WriteLine($"FileInfo로 'example.txt' 파일을 생성했어.");
FileInfo로 삭제하기:
FileInfo fi = new FileInfo("oldfile.txt");
if (fi.Exists)
{
fi.Delete();
Console.WriteLine("FileInfo로 파일을 삭제했어.");
}
FileInfo의 장점
생성/삭제뿐 아니라 파일 속성에 자주 접근하거나 여러 동작을 반복해야 한다면, 인스턴스 방식이 더 편리하고(때로는 성능상 이점도 있어) 코드가 더 읽기 쉬워.
7. "기술용" 파일 만들고 정리하기
앱이 "temp_data" 폴더에 임시 파일을 모아두고 있다고 치자. 이름이 "temp_"로 시작하는 파일들을 모두 삭제하고 싶어.
string tempFolder = "temp_data";
Directory.CreateDirectory(tempFolder);
for (int i = 1; i <= 5; i++)
{
string tempFile = Path.Combine(tempFolder, $"temp_{i}.txt");
File.WriteAllText(tempFile, $"테스트 데이터 {i}");
}
Console.WriteLine("임시 파일 5개 생성됨.");
// 이제 temp_*.txt 전부 삭제
foreach (string file in Directory.GetFiles(tempFolder, "temp_*.txt"))
{
File.Delete(file);
Console.WriteLine($"삭제된 파일: {file}");
}
오래된 임시 파일을 자동으로 정리하는 데 아주 잘 동작해.
8. 중요한 디테일: 예외와 안전
무엇이 잘못될 수 있나:
- 폴더에 쓰기/삭제 권한이 없을 수 있어 (예: C:\Windows 같은 곳)
- 파일이 다른 프로세스(또는 네 프로그램)에 의해 이미 사용 중일 수 있어
- 경로에 허용되지 않는 문자가 들어있을 수 있어 (예: *?<>)
- 파일을 확인한 뒤 삭제하기 전 사이에 다른 프로세스가 파일을 삭제해버릴 수도 있어 (그런 일도 생겨!)
어떻게 대비할까
프로덕션 코드에서는 이런 작업을 항상 try-catch로 감싸는 게 좋아:
try
{
File.Delete("trickyfile.txt");
Console.WriteLine("파일 삭제 완료.");
}
catch (UnauthorizedAccessException ex)
{
Console.WriteLine("파일을 삭제할 권한이 없어.");
}
catch (IOException ex)
{
Console.WriteLine("파일이 다른 프로세스에 의해 사용 중일 수 있어.");
}
catch (Exception ex)
{
Console.WriteLine($"오류: {ex.Message}");
}
9. 유용한 팁
항상 신경 써야 할 파일 관련 습관
- 경로 결합엔 Path.Combine을 사용해. 이러면 슬래시가 하나 더 붙거나 빠지는 문제 없고, 코드가 크로스플랫폼에서 더 안전해.
- 생성/삭제 전에 파일 존재를 확인해, 뜻하지 않은 일을 피하려면.
- 프로덕션이나 특히 다중 사용자 환경에선 try-catch로 감싸.
- 같은 파일에 자주 접근한다면 FileInfo를 쓰고, 한 번만 작업할 땐 File을 써.
- 파일을 필요 이상으로 열어두지 마. 파일이 열려 있니? 스스로에게 물어봐: "왜 열어두고 있지?" 그리고 닫아. 가능하면 using을 써.
기술 요약표
| 작업 | 메서드 | 비고 |
|---|---|---|
| 빈 파일 생성 | |
FileStream을 반환하니 닫아야 함 |
| 파일에 텍스트 쓰기 | |
파일이 없으면 생성, 있으면 덮어씀 |
| 존재 확인 | |
bool 반환 |
| 파일 삭제 | |
파일이 없으면 예외를 던지지 않음 |
| 폴더 안에 파일 생성 | |
폴더 보장 |
| FileInfo로 작업 | |
여러 작업에 적합 |
10. 파일 작업 시 흔한 실수
실수 #1: File.Create 후 스트림을 닫지 않는 것.
많은 초보가 File.Create로 파일을 만들고 반환된 스트림을 닫지 않아. 그 결과 나머지 코드가 파일을 '볼 수 없게' 되는 경우가 많아 — 마치 파일이 다른 우주로 간 것처럼. 스트림은 명시적으로 닫거나 (Close()) 가능한 한 using으로 감싸라.
실수 #2: 존재하지 않는 폴더에 파일을 만들려고 함.
전형적인 함정은 아직 없는 디렉터리에 파일을 만들려고 시도하는 거야. 미리 Directory.CreateDirectory를 호출하는 걸 잊지 마. 안전하니까 걱정 없어.
실수 #3: 파일을 확인하지 않고 그냥 삭제함.
가끔 아무 생각 없이 File.Delete를 호출하는 경우가 있어. 이 메서드는 파일이 없어도 오류를 내지 않지만, 경로가 틀리거나 권한이 없으면 예외가 날 수 있어. 상황에 따라 미리 처리하는 게 좋아.
실수 #4: File.Delete와 Directory.Delete를 혼동함.
File.Delete는 파일 전용이고, Directory.Delete는 폴더 전용이야. 폴더를 File.Delete로 삭제하려는 건 칫솔로 벽돌을 닦으려는 것과 비슷해: 기술적으로 시도할 수는 있겠지만 별로 좋지 않아.
GO TO FULL VERSION