Comportamento inconsistente de Directory.EnumerateFiles entre .NET Core e .NET Framework

Sep 10 2020

Tenho um projeto que contém dois arquivos: book.xlse book.xlsx. Se eu executar o seguinte código (no .NET Framework), ele encontrará os dois arquivos conforme o esperado, apesar de apenas passar .xlscomo extensão.

using System;
using System.IO;
using System.Linq;

namespace GetFilesFromExtensionsWithTests
{
    public class Program
    {
        static void Main(string[] args)
        {
            var filesWithExtension = FindFiles("../../", "*.xls");
            foreach (string file in filesWithExtension)
            {
                Console.WriteLine($"Found: {file}");
                // Found: ../../ book.xls
                // Found: ../../ book.xlsx
            }
            Console.ReadKey();
        }

        static public string[] FindFiles(string path, string extension)
        {
            var files = Directory.EnumerateFiles(path, extension).Select(p => p).ToArray();

            return files;
        }
    }
}

Este é o comportamento esperado: quando você passa uma extensão de três caracteres para Directory.EnumerateFilesela, você encontrará todas as extensões que começam com xls( documentos ):

Quando você usa o caractere curinga asterisco em um searchPattern, como "* .txt", o número de caracteres na extensão especificada afeta a pesquisa da seguinte maneira:

  • Se a extensão especificada tiver exatamente três caracteres, o método retornará arquivos com extensões que começam com a extensão especificada. Por exemplo, "* .xls" retorna "book.xls" e "book.xlsx".

O estranho é que se eu executar a FindFilespartir de um projeto xUnit (.NET Core), ele só encontrará book.xls:

using GetFilesFromExtensionsWithTests;
using Xunit;

namespace GetFilesFromExtensionsWithTests_Tests
{
    public class UnitTest1
    {
        [Fact]
        public void Test1()
        {
            string[] files = Program.FindFiles(
                @"..\..\..\..\FileExtensionsWithTests", "*.xls"
            );

            // Test fails, because it only finds book.xls, but not book.xlsx
            Assert.Equal(2, files.Length);
        }
    }
}

Por que existe uma diferença?

Editar 14 de setembro de 2020

É um problema conhecido https://github.com/dotnet/dotnet-api-docs/issues/4052

Respostas

1 Roald Sep 14 2020 at 07:09

É um problema conhecido relatado em https://github.com/dotnet/dotnet-api-docs/issues/4052