【问题标题】:Directory.GetFiles doesn't pick up all filesDirectory.GetFiles 不会提取所有文件
【发布时间】:2020-05-16 21:39:38
【问题描述】:

我有一些代码用于获取目录中的文件,这很简单

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 之后的任何内容。

我不明白为什么它获得了前四个文件,而不是底部。

我原以为原始代码不会提取任何文件?

【问题讨论】:

  • 相关文件是否已被删除,但被杀毒软件或类似软件保持打开状态?这可能会导致资源管理器仍然列出它的“幽灵”文件,但它实际上不再存在于磁盘上。
  • 显然前四个文件有a 8.3 name,最后一个没有。
  • 短名称是您的克星,当文件过多时,Totals~n.csv 不再适合您,您只能在Total* 上找到匹配项。键入 dir /x tot*.* 以查看短名称。您喜欢Totals.csv*,可能需要过滤以消除意外匹配。

标签: c# filenames


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多