Directory.EnumerateFiles와 Directory.GetFiles의 차이점은 무엇입니까?


145

의 차이 무엇입니까 Directory.EnumerateFiles대는 GetFiles?

분명히 하나는 배열을 반환하고 다른 하나는 Enumerable을 반환합니다.

다른 거있어?

답변:


173

에서 워드 프로세서 :

EnumerateFiles 및 GetFiles 메서드는 다음과 다릅니다. EnumerateFiles를 사용하면 전체 컬렉션이 반환되기 전에 이름 컬렉션 열거를 시작할 수 있습니다. GetFiles를 사용할 때는 배열에 액세스하기 전에 전체 이름 배열이 반환 될 때까지 기다려야합니다. 따라서 많은 파일과 디렉터리를 사용하는 경우 EnumerateFiles가 더 효율적일 수 있습니다.

그러니까 기본적으로, EnumerateFiles반환 IEnumerable하는 반면 게으르게 다소 평가 될 수있는 GetFiles반환 string[]은 반환하기 전에 가지고있는 완전히 채워 할 수 있습니다.


5
게으른 평가는 완전히 무료로 제공되지 않을 수 있습니다. 예를 들어 결국 배열에 다시 넣을 경우 (그것을 보았습니다!) 게으름은 "yagni"일 때 효과적입니다. 모든 요소가 필요하지 않으며 몇 가지 후에 반복을 중지합니다.
Tomasz Gandor

5
너무 큰 컬렉션을 열거하여 메모리에서 전체 컬렉션을 먼저 작성하는 것이 너무 무거울 경우 게으른 열거도 흥미 롭습니다. 당신은 그들이 올 때 항목을 처리하고 잊을 수 있습니다.
Stéphane Gourichon

1
@TomaszGandor : 또는 파일 이름을 바꾸는 등 모든 파일 이름을 저장할 필요가없는 경우.
Sebastian Mach

소스를 조사한 결과 두 가지 방법 모두 internal을 사용한다는 것을 알았습니다 FileSystemEnumerableFactory.CreateFileInfoIterator(). 그러나 EnumerateFiles()동안 직접 반복자를 반환 GetFiles()추가 구축 ListIT와 통화에서 ToArray(). 따라서 속도가 걱정된다면 EnumerateFiles()반복자를 직접 사용 하고 처리하는 것이 좋습니다.
C0DEF52

32

EnumerateFiles리턴 IEnumerable<string>되고 지연된 실행을 의미합니다. Fx4 이상에서만 사용할 수 있습니다.


2
Fx4는 무엇을 의미합니까?
Minh Nguyen

3
.net FrameWork 4
Henk Holterman

11
.NET 4.0의 특이한 이름입니다.
Snak

16

EnumerateFiles를 사용할 때를 사용하면 모든 속도가 손실됩니다 .Last. 마지막 파일에 도달하려면 모든 파일을 열거 한 다음 마지막 파일을 가져와야하므로 당연한 일입니다.

그러나 단순히 첫 번째 항목을 잡고 계속 진행하기 때문에 사용 .First하거나 .FirstOrDefault매우 빠르게됩니다.


6
이 아주 오래된 질문은 따로 있었다 어떤 차이 물었다 ArrayEnumerable측면. 귀하의 답변은 이러한 모든 상황에 대해 일반적인 것이지만 질문에 대한 답변은 아닙니다.
Ashigore

2
요점은 EnumerateFiles를 사용하면 경우에 따라 데이터에 더 빠르게 액세스 할 수 있다는 것입니다.
Skotte

16
요점은 이것은 주석으로 매우 유용하지만 질문에 대답하지는 않는다는 것입니다. 구별이 있습니다.
djv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.