Directory.GetFilesがすべてのファイルを取得しない


23

ディレクトリ内のファイルを取得するためのコードがいくつかあります。

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

ファイルの名前は次のとおりです。

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

私の問題は、最後のファイルを取得していないことです。

代わりにこれを置くことでコードを修正しました:

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

Totalsと.csvの両方を含み、.csvの後ろにあるファイルを取得するとします。

取得できないのは、上位4つのファイルが取得されたが、最後のファイルが取得されなかった理由です。

元のコードがファイルを取得しないと思いましたか?


1
問題のファイルは削除されましたが、ウイルス対策などで開いたままになっていますか?これは、エクスプローラーがまだリストする「ゴースト」ファイルにつながる可能性がありますが、実際にはもはやディスク上に存在していません。
Lasse V. Karlsen、

6
どうやら最初の4つのファイルには8.3の名前があり、最後のファイルにはありません。
GSerg

1
短い名前は宿敵です。ファイルが多すぎると、収まらTotals~n.csvなくなり、でのみ一致を取得できますTotal*。入力dir /x tot*.*して短い名前を表示します。あなたは賛成Totals.csv*と偶然の一致を排除するためにフィルタリングする必要があります。
ハンスパッサント

回答:


20

どうやらGetFilesそれは言うに実装されているように、パターンマッチングロジックに付着dirコマンド。

MSDN

この方法では、8.3形式のファイル名と長いファイル名の両方の形式のファイル名がチェックされるため、に類似した検索パターンでは、"*1*.txt"予期しないファイル名が返される 場合があります。たとえば、"*1*.txt"8.3のファイル名形式は「LONGFI〜1.TXT」であるため、検索パターンを使用すると「longfilename.txt」が返されます。

@GSergが指摘したように、一部のファイルには一致する8.3名があります。

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

Totals.csv*すべてのファイルに一致するようにパターンを変更してみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.