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之后的任何文件。

我不明白的是为什么它得到了前四个文件,却没有得到最后四个文件。

我以为原始文件不会拾取任何文件?


1
相关文件是否已删除,但已被防病毒软件或类似软件打开?这可能会导致一个“ ghost”文件,资源管理器仍在其中列出该文件,但实际上它不再存在于磁盘上。
Lasse V. Karlsen

6
显然前四个文件的名称是8.3,而最后一个文件的名称不是。
GSerg

1
短名称是您的宿敌,当文件太多时就Totals~n.csv不再适合,您只能在上找到匹配项Total*。键入dir /x tot*.*以查看短名称。您赞成Totals.csv*并且可能需要过滤以消除意外匹配。
汉斯·帕桑

Answers:


20

显然,GetFiles遵循说dir命令中实现的模式匹配逻辑。

MSDN

因为此方法检查8.3文件名格式和长文件名格式的文件名,所以类似于的搜索模式 "*1*.txt"可能会返回意外的文件名。例如,使用搜索模式"*1*.txt"返回“ longfilename.txt”,因为等效的8.3文件名格式为“ LONGFI〜1.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*以匹配所有文件。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.