C#의 Directory.EnumerateFiles 메서드란?
C#에서 Directory.EnumerateFiles() 메서드는 지정한 경로에 존재하는 파일들을 열거(enumerate)하는 데 사용됩니다. 이 메서드는 파일 전체 목록을 미리 로딩하지 않고 필요할 때마다 하나씩 반환하는 지연 평가(lazy evaluation) 방식으로 동작하기 때문에, 대용량 디렉터리를 다룰 때 성능 면에서 유리합니다.
특히 SearchOption.AllDirectories 옵션을 사용하면 현재 폴더뿐만 아니라 그 아래의 모든 하위 폴더까지 재귀적으로 탐색하여 파일을 검색할 수 있습니다.
Directory.EnumerateFiles(@"D:\NEW", "*.*", SearchOption.AllDirectories)
주요 매개변수
- path: 탐색을 시작할 디렉터리 경로입니다.
- searchPattern: 검색할 파일 패턴입니다. 예를 들어 "*.*"는 모든 파일을 의미하며, "*.txt"처럼 특정 확장자만 지정할 수도 있습니다.
- searchOption: TopDirectoryOnly(현재 폴더만) 또는 AllDirectories(하위 폴더 포함) 중 선택합니다.
예제 코드
다음은 D 드라이브의 NEW 폴더와 그 하위 폴더에 있는 모든 파일을 출력하는 예제입니다.
using System;
using System.IO;
namespace Demo {
class Program {
static void Main(string[] args) {
foreach (string allFiles in Directory.EnumerateFiles(@"D:\NEW", "*.*", SearchOption.AllDirectories)) {
Console.WriteLine(allFiles);
}
}
}
}실행 결과
위 코드를 실행하면 다음과 같이 하위 폴더까지 포함한 전체 파일 경로가 출력됩니다.
D:\NEW\my.txt D:\NEW\amit.html D:\NEW\tutorials\java\a.java
GetFiles와의 차이점
Directory.GetFiles()도 같은 기능을 수행하지만, 두 메서드에는 중요한 차이가 있습니다.
- GetFiles(): 검색 결과를 배열에 모두 담은 후 반환하므로, 파일이 많으면 첫 번째 결과를 받기까지 시간이 오래 걸릴 수 있습니다.
- EnumerateFiles(): 검색을 진행하면서 파일 정보를 하나씩 스트리밍 방식으로 반환하므로, 대규모 디렉터리 탐색 시 더 빠르게 작업을 시작할 수 있습니다.
따라서 파일 개수가 많거나 하위 폴더를 광범위하게 탐색해야 하는 경우에는 EnumerateFiles() 사용을 권장합니다.