
지난번에는 C#에서 파일과 폴더 정보를 조회하는 방법을 알아봤습니다.
이제는 여러분이 직접 C#으로 폴더와 파일을 생성하는 방법을 배워볼 차례입니다.
이번 글에서는 System.IO네임스페이스의 또 다른 주인공들을 다뤄보겠습니다.
지난번 우리는 DirectoryInfo와 FileInfo라는 인스턴스 클래스를 사용했습니다.
하지만 이번에 사용할 Directory와 File은 정적(static) 클래스입니다.
객체를 생성할 필요 없이, 클래스 이름에 점(.)을 찍어 기능을 바로 사용할 수 있습니다.
새로운 폴더(디렉터리)를 만들 때는 Directory.CreateDirectory()메서드를 사용합니다.
이 메서드는 몇 가지 편리한 특징을 가지고 있어요.
C:\MyProject\Data\Logs처럼 중간 폴더가 없어도, 전부 알아서 만들어줍니다!이런 특징 덕분에 우리는 폴더를 확인하지 않고 바로 생성 명령을 내릴 수 있습니다.
[코드]
using System;
using System.IO;
// 1. 단순한 경로에 폴더 생성
string path1 = @"C:\Temp\NewFolder";
Directory.CreateDirectory(path1);
Console.WriteLine($"{path1} 폴더가 생성되었거나 이미 존재합니다.");
// 2. 여러 단계의 하위 폴더를 한 번에 생성
string path2 = @"C:\Temp\MyProject\Data\Logs";
Directory.CreateDirectory(path2);
Console.WriteLine($"{path2} 폴더가 생성되었거나 이미 존재합니다.");
// 존재하는지 확인 후 생성하고 싶다면?
if (!Directory.Exists(path2))
{
Directory.CreateDirectory(path2);
Console.WriteLine("폴더를 새로 생성했습니다.");
}
else
{
Console.WriteLine("폴더가 이미 존재하네요!");
}
[실행 결과]
C:\Temp\NewFolder 폴더가 생성되었거나 이미 존재합니다.
C:\Temp\MyProject\Data\Logs 폴더가 생성되었거나 이미 존재합니다.
폴더가 이미 존재하네요!
잠깐!
Directory와DirectoryInfo중에서 우리는 어떤 걸 써야 할까요?
Directory(정적 클래스): 폴더 생성, 삭제, 이동 등
'일회성 작업'을 간단하게 처리할 때 편리합니다.DirectoryInfo(인스턴스 클래스): 특정 폴더 하나를 지정해서 그 폴더의 정보 조회,
하위 파일 목록 가져오기 등 '다양한 작업'을 연달아 할 때 유용합니다.
이제 폴더를 만들었으니 File.Create()메서드를 사용해서 파일을 만들어 볼까요?
하지만 여기에는 중요한 주의 사항이 있습니다. File.Create()는
파일을 생성함과 동시에 해당 파일에 대한 FileStream을 열어서 반환합니다.
이 스트림을 닫아주기 전까지는 파일이 계속 '사용 중'인 상태로 잠겨있게 됩니다.
따라서 using구문을 사용해서 스트림이 자동으로 닫히도록 처리해야 합니다.
[코드]
using System;
using System.IO;
string path1 = @"C:\Temp\NewFolder";
Directory.CreateDirectory(path1);
string filePath = @"C:\Temp\NewFolder\MyFile.txt";
// using 블록을 사용하면 코드가 끝나자마자 스트림이 자동으로 닫힙니다.
try
{
using (FileStream fs = File.Create(filePath))
{
Console.WriteLine($"{filePath} 파일이 생성되었습니다.");
// 지금은 파일에 아무것도 쓰지 않고 생성만 합니다.
}
}
catch (Exception ex)
{
Console.WriteLine($"파일 생성 중 오류 발생: {ex.Message}");
}
[실행 결과]
C:\Temp\NewFolder\MyFile.txt 파일이 생성되었습니다.
'텍스트 파일' 하나만 만든다면 더 간단한 방법이 있습니다.
File.WriteAllText()메서드에 빈 문자열("")을 내용으로 전달하는 것입니다.
이 방법은 파일을 만들고, 내용을 쓰고, 닫는 것까지 한 번에 처리해 줍니다.
[코드]
using System;
using System.IO;
string path1 = @"C:\Temp\NewFolder";
Directory.CreateDirectory(path1);
string simpleFilePath = @"C:\Temp\NewFolder\MySimpleFile.log";
try
{
// 내용이 없는 텍스트 파일을 생성하고 싶을 때 가장 간단한 방법!
File.WriteAllText(simpleFilePath, "");
Console.WriteLine($"{simpleFilePath} 파일이 생성되었습니다.");
}
catch (Exception ex)
{
Console.WriteLine($"파일 생성 중 오류 발생: {ex.Message}");
}
[실행 결과]
C:\Temp\NewFolder\MySimpleFile.log 파일이 생성되었습니다.
이제 우리는 정보를 조회할 뿐만 아니라 직접 생성까지 할 수 있게 되었습니다!
| 클래스 | 메서드 | 특징 |
|---|---|---|
Directory | CreateDirectory(path) | 경로의 모든 폴더를 한 번에 생성. 이미 존재해도 오류 없음. |
File | Create(path) | 파일을 만들고 스트림을 반환. 파일이 잠길 수 있으므로 using 사용! |
File | WriteAllText(path, "") | 텍스트 파일을 가장 간단하게 만드는 방법. |