Directory.GetFiles nimmt nicht alle Dateien auf

23

Ich habe einen Code, der dazu gedacht ist, Dateien in einem Verzeichnis abzurufen, was einfach genug ist

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

Die Dateien heißen wie folgt:

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

Mein Problem ist, dass es nicht die letzte Datei aufnimmt.

Ich habe den Code korrigiert, indem ich stattdessen Folgendes eingefügt habe:

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

Wenn Sie sagen, erhalten Sie alle Dateien, die sowohl Summen als auch .csv enthalten, mit allem nach der .csv.

Was ich nicht verstehe, ist, warum es die oberen vier Dateien hat, aber nicht die unteren.

Ich hätte gedacht, dass keine der Dateien vom Originalcode erfasst wird?

zedgraphsad
quelle
1
Wurde die betreffende Datei gelöscht, wird sie jedoch von Antivirus oder ähnlichem geöffnet? Dies kann zu einer "Geister" -Datei führen, in der der Explorer sie noch auflistet, die jedoch nicht mehr auf der Festplatte vorhanden ist.
Lasse V. Karlsen
6
Anscheinend haben die ersten vier Dateien einen 8.3-Namen und die letzte nicht.
GSerg
1
Der Kurzname ist Ihre Nemesis. Wenn zu viele Dateien vorhanden sind Totals~n.csv, passen sie nicht mehr und Sie können nur eine Übereinstimmung finden Total*. Geben Sie ein dir /x tot*.*, um Kurznamen anzuzeigen. Sie bevorzugen Totals.csv*und müssen möglicherweise filtern, um versehentliche Übereinstimmungen zu vermeiden.
Hans Passant

Antworten:

20

Anscheinend wird GetFilesdie Mustervergleichslogik eingehalten, wie sie beispielsweise im dirBefehl implementiert ist .

MSDN

Da diese Methode sowohl mit dem 8.3-Dateinamenformat als auch mit dem langen Dateinamenformat gegen Dateinamen prüft, kann ein ähnliches Suchmuster "*1*.txt"unerwartete Dateinamen zurückgeben. Wenn Sie beispielsweise ein Suchmuster verwenden, wird "*1*.txt""longfilename.txt" zurückgegeben, da das entsprechende 8.3-Dateinamenformat "LONGFI ~ 1.TXT" lautet.

Wie @GSerg zeigte, haben einige Ihrer Dateien einen passenden 8.3-Namen.

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

Versuchen Sie, das Muster so zu ändern, dass Totals.csv*es mit allen Dateien übereinstimmt.

user1859022
quelle