Directory.GetFiles ne récupère pas tous les fichiers

23

J'ai du code destiné à obtenir des fichiers dans un répertoire, ce qui est assez simple

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

Les fichiers sont nommés comme suit:

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

Mon problème est qu'il ne récupère pas le dernier fichier.

J'ai corrigé le code en mettant ceci à la place:

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

Dire obtenir tous les fichiers contenant à la fois Totaux et .csv, avec quoi que ce soit après le .csv.

Ce que je ne comprends pas, c'est pourquoi il a obtenu les quatre premiers fichiers, mais pas le bas.

J'aurais pensé qu'aucun des fichiers ne serait récupéré par le code d'origine?

zedgraphsad
la source
1
Le fichier en question a-t-il été supprimé, mais est-il maintenu ouvert par un antivirus ou similaire? Cela peut conduire à un fichier "fantôme" où l'explorateur le répertorie toujours, mais il n'existe plus sur le disque.
Lasse V. Karlsen
6
Apparemment, les quatre premiers fichiers ont un nom 8.3 et le dernier n'en a pas.
GSerg
1
Le nom court est votre ennemi juré, quand il y a trop de fichiers, il Totals~n.csvne convient plus et vous ne pouvez obtenir qu'une correspondance Total*. Tapez dir /x tot*.*pour voir les noms courts. Vous privilégiez Totals.csv*et devrez peut-être filtrer pour éliminer les correspondances accidentelles.
Hans Passant

Réponses:

20

Apparemment, GetFilesadhère à la logique de correspondance de motifs telle qu'elle est implémentée dans, disons, la dircommande.

MSDN

Étant donné que cette méthode vérifie les noms de fichiers avec le format de nom de fichier 8.3 et le format de nom de fichier long, un modèle de recherche similaire à "*1*.txt"peut renvoyer des noms de fichier inattendus. Par exemple, l'utilisation d'un modèle de recherche "*1*.txt"renvoie «longfilename.txt» car le format de nom de fichier 8.3 équivalent est «LONGFI ~ 1.TXT».

Comme l'a souligné @GSerg, certains de vos fichiers ont un nom 8.3 correspondant.

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

Essayez de changer le modèle pour Totals.csv*faire correspondre tous les fichiers.

user1859022
la source