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
所涉及的文件是否已被删除,但被防病毒软件或类似软件保持打开状态?这可能会导致“幽灵”文件,在资源管理器中仍会列出该文件,但实际上它已不再存在于磁盘中。 - Lasse V. Karlsen
6
显然前四个文件都有一个“8.3名称”,而最后一个文件没有。 - GSerg
1
短名称是你的敌人,当文件太多时,“Totals〜n.csv”不再适用,你只能在“Total *”上找到匹配项。键入“dir / x tot ”以查看短名称。你更喜欢“Totals.csv *”,可能需要过滤掉意外匹配项。 - Hans Passant
1个回答

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*以匹配所有文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接