Qual é a diferença entre Directory.EnumerateFiles vs Directory.GetFiles?

145

Qual é a diferença entre Directory.EnumerateFilesvs GetFiles?

Obviamente, um retorna uma matriz e o outro retorna Enumerable.

Algo mais?

DarthVader
fonte

Respostas:

173

Dos documentos :

Os métodos EnumerateFiles e GetFiles diferem da seguinte maneira: Quando você usa EnumerateFiles, pode começar a enumerar a coleção de nomes antes que a coleção inteira seja retornada; ao usar GetFiles, você deve aguardar o retorno de toda a matriz de nomes antes de poder acessar a matriz. Portanto, quando você estiver trabalhando com muitos arquivos e diretórios, EnumerateFiles pode ser mais eficiente.

Então, basicamente, EnumerateFilesretornos IEnumerableque podem ser avaliados de alguma forma preguiçosamente, enquanto GetFilesretornos string[]que precisam ser totalmente preenchidos antes que possam retornar.

Daniel DiPaolo
fonte
5
A avaliação preguiçosa pode não ser totalmente gratuita - por exemplo, se você a colocar de volta em uma matriz no final (eu vi isso!). Preguiçoso é eficiente quando "yagni" -todos: você não precisará de todos os elementos e pára de iterar depois de alguns.
Tomasz Gandor
5
A enumeração lenta também é interessante se você enumerar uma coleção tão grande que criar a coleção inteira primeiro na memória é muito pesado. Você pode apenas processar os itens quando eles vierem e esquecê-los.
Stéphane Gourichon
1
@TomaszGandor: Ou quando não há necessidade de armazenar todos os nomes de arquivos, por exemplo, ao renomear arquivos.
Sebastian Mach
Examinei as fontes e descobri que ambos os métodos usam interno FileSystemEnumerableFactory.CreateFileInfoIterator(). Mas EnumerateFiles()retorna esse iterador diretamente enquanto GetFiles()cria extra Liste chama ToArray(). Portanto, se você se preocupa com a velocidade, faz sentido usar EnumerateFiles()e lidar com o iterador.
C0DEF52
32

EnumerateFilesretorna IEnumerable<string>e isso implica execução adiada. Está disponível apenas em Fx4 e superior.

Henk Holterman
fonte
2
o que significa Fx4?
Minh Nguyen
3
.net FrameWork 4
Henk Holterman
11
Isso é um nome incomum para .NET 4.0
Snak
16

Ao usar EnumerateFiles, toda a velocidade será perdida se você estiver usando .Last. Isso faz sentido, é claro, porque para chegar ao último arquivo, ele precisará enumerar todos os arquivos e pegar o último.

No entanto, usar .Firstou .FirstOrDefaultse torna muito rápido, porque simplesmente pega o primeiro item e segue em frente.

Skotte
fonte
6
Esta pergunta muito antiga perguntou quais eram as diferenças além do aspecto Arrayvs. EnumerableSua resposta é genérica para todas essas situações, mas não responde à pergunta.
Ashigore
2
O ponto é que EnumerateFiles permite que você comece a acessar dados mais rapidamente, em alguns casos.
30515 Skotte
16
O ponto é que isso é muito útil como um comentário, mas não responde à pergunta. Há uma distinção.
DJV