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
이 아주 오래된 질문은 따로 있었다 어떤 차이 물었다 Array대 Enumerable측면. 귀하의 답변은 이러한 모든 상황에 대해 일반적인 것이지만 질문에 대한 답변은 아닙니다.
— Ashigore

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

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