HOWTO · Csharp
C#에서 디렉터리의 모든 파일 삭제
C#에서 디렉터리 바로 아래의 파일만 삭제하려면 각 파일에 FileInfo.Delete()를 호출하고, 하위 디렉터리까지 재귀적으로 삭제하려면 대상 디렉터리에 DirectoryInfo.Delete(true)를 호출합니다. 후자는 호출한 디렉터리 자체와 그 안의 내용도 삭제합니다.
이 페이지의 내용
디렉터리 바로 아래의 모든 파일을 삭제하려면 파일을 열거한 뒤 각 파일에 FileInfo.Delete()를 호출합니다. 이 방법은 대상 디렉터리와 하위 디렉터리를 그대로 둡니다. 하위 디렉터리까지 삭제하면 그 안의 내용도 재귀적으로 삭제되므로, 해당 동작이 필요한 경우에만 선택하세요. (C#; DirectoryInfo.Delete(true)) (DirectoryInfo.Delete())
DirectoryInfo.GetFiles()로 파일만 삭제하기
DirectoryInfo.GetFiles()는 대상 디렉터리 바로 아래에 있는 파일을 나타내는 FileInfo 객체 배열을 반환합니다. 각 객체에 FileInfo.Delete()를 호출하면 해당 파일이 삭제되며, 하위 디렉터리 안의 파일은 처리하지 않습니다. 예제는 임시 대상 디렉터리와 샘플 파일을 만든 뒤 파일을 삭제하고 대상 디렉터리가 여전히 존재한다고 표시합니다. 마지막에는 정리 과정에서 그 임시 디렉터리를 삭제합니다.
다음 예제를 실행하세요.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
using System;
using System.IO;
class Program
{
static void Main()
{
string path = Path.Combine(Path.GetTempPath(), "csharp-file-cleanup-" + Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(path);
File.WriteAllText(Path.Combine(path, "first.txt"), "one");
File.WriteAllText(Path.Combine(path, "second.txt"), "two");
var directory = new DirectoryInfo(path);
int removed = 0;
foreach (FileInfo file in directory.GetFiles())
{
file.Delete();
removed++;
}
Console.WriteLine($"Files removed: {removed}");
Console.WriteLine($"Target directory remains: {directory.Exists}");
Directory.Delete(path);
}
}
Files removed: 2
Target directory remains: True
경로는 운영 체제의 임시 디렉터리 아래에 있습니다. 애플리케이션 코드에서는 경로를 실제로 사용할 위치로 설정하고 프로세스에 해당 위치를 수정할 권한이 있는지 확인하세요. 파일이 잠겨 있거나 액세스가 거부되면 삭제에 실패할 수 있습니다. 모든 호출이 성공한다고 가정하지 말고 애플리케이션에 필요한 I/O 또는 권한 오류를 처리하세요.
DirectoryInfo.GetDirectories()로 파일과 하위 디렉터리 삭제하기
파일과 하위 디렉터리를 모두 삭제하려면 먼저 대상 디렉터리 바로 아래의 파일을 삭제한 다음 DirectoryInfo.GetDirectories()로 하위 디렉터리를 가져와 각 디렉터리에 DirectoryInfo.Delete(true)를 호출합니다. true 인수는 해당 하위 디렉터리와 그 안의 내용을 재귀적으로 삭제합니다. 대상 디렉터리 자체는 남습니다. 데이터가 삭제되는 작업이므로 실행 전에 대상 경로를 확인하고 재귀 삭제가 적절한지 점검하세요.
작업 순서는 foreach (FileInfo file in directory.GetFiles()) file.Delete(); 다음에 foreach (DirectoryInfo child in directory.GetDirectories()) child.Delete(true);입니다. 두 반복문은 이 순서로 두고 프로그램에서 실제 대상 DirectoryInfo 인스턴스를 사용하세요.
DirectoryInfo.EnumerateFiles()로 파일 삭제하기
DirectoryInfo.EnumerateFiles()는 FileInfo 객체의 열거 가능한 시퀀스를 제공하므로 foreach 반복문에서 바로 처리할 수 있습니다. 반면 GetFiles()는 배열을 반환합니다. 두 방법 모두 대상 디렉터리 바로 아래의 파일을 삭제할 수 있지만 하위 디렉터리는 삭제하지 않습니다. 결과를 배열로 받아야 하는지, 시퀀스를 순회하면 되는지에 따라 방법을 선택하세요. 모든 작업에서 열거 방식이 더 빠르다고 보장되지는 않습니다.
파일만 삭제할 때 반복문 본문은 file.Delete()입니다.
이 섹션의 코드와 표시되는 레이블 또는 출력은 영어로 유지됩니다.
using System;
using System.IO;
class Program
{
static void Main()
{
string path = Path.Combine(Path.GetTempPath(), "csharp-enumerate-files-" + Guid.NewGuid().ToString("N"));
Directory.CreateDirectory(path);
File.WriteAllText(Path.Combine(path, "sample.txt"), "content");
var directory = new DirectoryInfo(path);
foreach (FileInfo file in directory.EnumerateFiles())
{
file.Delete();
}
Console.WriteLine($"Files remaining: {directory.GetFiles().Length}");
Directory.Delete(path);
}
}
Files remaining: 0
DirectoryInfo.EnumerateDirectories()로 하위 디렉터리 삭제하기
DirectoryInfo.EnumerateDirectories()는 대상 디렉터리의 하위 디렉터리를 열거합니다. 하위 디렉터리의 전체 트리를 삭제해야 한다면 각 디렉터리에 Delete(true)를 호출하세요. 이 작업은 대상 디렉터리 바로 아래의 파일은 삭제하지 않으므로 파일과 하위 디렉터리를 모두 삭제해야 한다면 파일만 처리하는 반복문도 함께 사용하세요. 하위 디렉터리를 삭제한 뒤에도 대상 디렉터리는 남습니다.
하위 디렉터리를 처리하는 코드는 foreach (DirectoryInfo child in directory.EnumerateDirectories()) child.Delete(true);입니다. 재귀 삭제가 의도된 경우가 아니라면 이 반복문을 파일만 정리하는 작업에 포함하지 마세요.
방법을 선택하고 결과 확인하기
배열이 필요하면 GetFiles()를 사용하고, 파일 결과를 열거 가능한 시퀀스로 처리하려면 EnumerateFiles()를 사용하세요. 두 방법 모두 파일만 처리합니다. 작업에 재귀 삭제가 포함되는 경우에만 Delete(true)를 사용하는 하위 디렉터리 반복문을 추가하세요. 삭제 전에 선택한 경로를 확인하고, 삭제한 뒤에는 GetFiles()와 GetDirectories()로 디렉터리 내용을 확인하세요. 경로가 없거나 액세스할 수 없는 경우 또는 삭제할 수 없는 파일이 있는 경우 작업이 완료되지 않을 수 있습니다.