Directory.GetFiles – salida diferente dependiendo del sistema operativo

Tengo un progtwig simple. Ejecuta .NET 4.5 y está construido en Visual Studio 2013.

D:\\MyDir está lleno de archivos .xlsx y ningún archivo .xls . Cuando ejecuto el progtwig en Windows 8.1 x64, el filtro para *.xls no devuelve resultados. Cuando ejecuto el mismo progtwig, con la misma versión de .NET en Windows 7 x86, el filtro *.xls devuelve los mismos resultados que el filtro *.xlsx .

Las carpetas de prueba en ambos sistemas definitivamente contienen los mismos datos.

¿Me estoy perdiendo algo, o es un error en .NET y / o Windows?

El código respectivo:

 using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; namespace throw_test { static class Program { static void Main() { int fileCount1 = Directory.GetFiles("D:\\MyDir", "*.xlsx").Length; int fileCount2 = Directory.GetFiles("D:\\MyDir", "*.xls").Length; Console.WriteLine("File Count 1: " + fileCount1); Console.WriteLine("File Count 2: " + fileCount2); Console.Read(); } } } 

Editar 1

Cuando navego al directorio usando el indicador de comando en Windows 8.1 x64:

  • dir *.xlsx devuelve todos los archivos como se esperaba
  • dir *.xls devuelve ‘Archivo no encontrado’

Windows 7 devuelve los archivos esperados en los dos comandos anteriores.

Mi conjetura es que .NET usa este comando debajo del capó, por lo tanto, ¿los resultados anteriores?

Su comportamiento de Windows 7 es por diseño . De la documentación sobre el método GetFiles () (vea la primera nota debajo de la sección “Comentarios”):

Cuando se usa el carácter comodín de asterisco en un patrón de búsqueda, como “* .txt”, el comportamiento coincidente cuando la extensión tiene exactamente tres caracteres es diferente de cuando la extensión tiene más o menos tres caracteres. Un searchPattern con una extensión de archivo de exactamente tres caracteres devuelve archivos que tienen una extensión de tres o más caracteres, donde los tres primeros caracteres coinciden con la extensión de archivo especificada en searchPattern. Un searchPattern con una extensión de archivo de uno, dos o más de tres caracteres devuelve solo los archivos que tienen extensiones de exactamente la misma longitud que coinciden con la extensión de archivo especificada en searchPattern.

El comportamiento de Windows 8.1 no es reproducible para mí. Acabo de realizar una prueba en mi máquina con Windows 8.1 x64 y coincide con el comportamiento esperado de Windows 7. Me gustaría comprobar que la carpeta actual en la máquina es correcta.

También puedo obtener los mismos resultados simplemente abriendo un indicador de comando, navegando al directorio apropiado y escribiendo dir *.xls . Espero que tanto la función GetFiles () como el símbolo del sistema pasen el patrón de búsqueda a la misma función del sistema operativo de bajo nivel.

Se trata de algunos temas diferentes, pero esta publicación también merece una lectura:

http://blogs.msdn.com/b/oldnewthing/archive/2007/12/17/6785519.aspx

Probé en mi máquina con *.xls y todos los archivos xlsx se devuelven, tal como lo describe MDSN .

Tengo Visual Studio 2013, creado como Debug / Release Cualquier CPU en .NET 4.5, y ejecuto en Win 8.1 X64 contra la partición NTFS / FAT32, debería cubrir su entorno. ¿Tienes algo más especial?

EDITAR

De acuerdo con esta pregunta , es posible que haya deshabilitado la asignación de nombres 8.3 en su sistema Win 8.1 ejecutando:

 fsutil behavior set disable8dot3 

Puede consultar el estado actual ejecutando

 fsutil behavior query disable8dot3  

En mi máquina devuelve la configuración por defecto como:

El estado del volumen es: 0 (la creación del nombre 8dot3 está habilitada).
El estado del registro es: 2 (Por configuración de volumen – el valor predeterminado).

De acuerdo con las dos configuraciones anteriores, la creación del nombre 8dot3 está habilitada en c: