Directory.GetFiles no recoge todos los archivos

23

Tengo un código destinado a obtener archivos en un directorio, que es lo suficientemente simple

foreach (var Totalfile in new DirectoryInfo(rootfolder).GetFiles("*Totals*.csv", SearchOption.TopDirectoryOnly))

Los archivos se nombran de la siguiente manera:

Totals.CSV142344
Totals.CSV142409
Totals.CSV142433
Totals.CSV142501
Totals.CSV142528

Mi problema es que no está recogiendo el último archivo.

He arreglado el código al poner esto en su lugar:

foreach (var Totalfile in new DirectoryInfo(rootfolder).GetFiles("*Totals*.csv*", SearchOption.TopDirectoryOnly))

Diciendo obtener cualquier archivo que contenga Totales y .csv, con cualquier cosa después de .csv.

Lo que no entiendo es por qué obtuvo los cuatro archivos principales, pero no el inferior.

¿Pensé que ninguno de los archivos sería recogido por el código original?

zedgraphsad
fuente
1
¿Se ha eliminado el archivo en cuestión, pero se mantiene abierto por antivirus o similar? Esto podría conducir a un archivo "fantasma" donde el explorador todavía lo enumera, pero en realidad ya no existe en el disco.
Lasse V. Karlsen
66
Aparentemente, los primeros cuatro archivos tienen un nombre 8.3 y el último no.
GSerg
1
El nombre corto es tu némesis, cuando hay demasiados archivos Totals~n.csvya no se ajusta y solo puedes obtener una coincidencia Total*. Escriba dir /x tot*.*para ver nombres cortos. Usted favorece Totals.csv*y puede que tenga que filtrar para eliminar coincidencias accidentales.
Hans Passant

Respuestas:

20

Aparentemente se GetFilesadhiere a la lógica de coincidencia de patrones, ya que se implementa en decir el dircomando.

MSDN

Debido a que este método verifica los nombres de archivo con el formato de nombre de archivo 8.3 y el formato de nombre de archivo largo, un patrón de búsqueda similar "*1*.txt"puede devolver nombres de archivo inesperados. Por ejemplo, usando un patrón de búsqueda de "*1*.txt"retornos "longfilename.txt" porque el formato de nombre de archivo 8.3 equivalente es "LONGFI ~ 1.TXT".

Como @GSerg señaló, algunos de sus archivos tienen un nombre 8.3 coincidente.

dir /x *Totals*.csv*

2020-01-31  09:33                 0 TOTALS~1.CSV Totals.CSV142344
2020-01-31  09:33                 0 TOTALS~2.CSV Totals.CSV142409
2020-01-31  09:33                 0 TOTALS~3.CSV Totals.CSV142433
2020-01-31  09:33                 0 TOTALS~4.CSV Totals.CSV142501
2020-01-31  09:33                 0 TO5404~1.CSV Totals.CSV142528

Intente cambiar el patrón para Totals.csv*que coincida con todos los archivos.

usuario1859022
fuente