【问题标题】:Problems With File Name Matching in C#C# 中的文件名匹配问题
【发布时间】:2014-08-21 19:52:50
【问题描述】:

我之前发布过类似的东西,但它是关于处理命令提示符的。在另一个例子中,我正在尝试在我执行维护的 ERP 系统中进行备份之前进行一些自动文件清理,以使流程变得顺畅(因为我对这些系统中的半打至少执行了两次维护每一个月)。所以,这里有一些正在发生的事情的例子......

以下是目录中可能出现的三个文件名:

  • AP_AnalysisWrk.M4T
  • AP_AnalysisWrkMPM201408211313.M4T
  • AP_AnalysisWrkNG201408211313.M4T

在这三个中,后两个将是删除的候选者,而第一个将需要保留。因此,最初我使用以下内容仅检索后两个:

String[] wrkFileList = Directory.GetFiles(directoryPath, "??_*Wrk??*????????????.M4T");

但是,由于某种原因,它总是返回所有三个,即使第一个与模式不匹配。在 Windows 资源管理器中使用此模式时,它只返回所需的后两个文件。我已经使用正则表达式开发了一种解决方法,该方法有效:

Regex wrkFileMatch = new Regex("([A-z]{2}_[A-z0-9]+Wrk[A-Z0-9]{2,3}\\d{12}.(m4t|M4T))$");

不过,我并不喜欢这种方法,因为它添加了一个不必要的循环,因为我必须遍历所有结果才能获得正确的结果。性能方面,这似乎并不重要,但我想了解为什么初始模式匹配不能只返回正确的匹配。是否有更好的方法来使用 GetFiles 过滤文件名,或者我是否可以更好地遍历目录结果并使用 RegEx 匹配来查找正确的文件(就像我目前正在做的那样)?

【问题讨论】:

    标签: c# regex file getfiles


    【解决方案1】:

    来自Directory.GetFiles Method (String, String)的文档

    searchPattern 可以是文字和通配符的组合,但不支持正则表达式。 searchPattern 中允许使用以下通配符说明符。

    • *(星号):该位置有零个或多个字符。
    • ?(问号):该位置有零个或一个字符。

    鉴于此,AP_AnalysisWrk.M4T 确实匹配 ??_*Wrk??*????????????.M4T,因为末尾的所有 ??*???????????? 字符都可以匹配空字符串。

    因此,您可以使用Directory.GetFiles() 进行粗略的初始匹配,然后使用正则表达式更精确地过滤返回。

    【讨论】:

    • 也许命令提示符也是如此。适合我认为 Windows 资源管理器和 C# 会处理“?”通配符以相同的方式。我将修改我的代码以更有效地使用 RegEx。谢谢。
    • 使用Directory.GetFiles() 进行粗略的初始过滤不是一个坏主意。我的回忆是,当访问映射的网络驱动器时,过滤是在服务器上完成的,从而减少了扫描巨大目录的网络流量。
    • 这实际上是直接在托管文件的服务器上执行的,因此网络流量没有问题。但是,即使它是在映射驱动器上完成的,网络流量也不是问题,因为工作是在网络大部分空闲的深夜完成的。我认为在这种情况下,网络速度可能会成为一个更大的问题。无论如何,每次被清除的文件数量大约在 700-800 个文件之间,总共 3GB 到 10GB。
    【解决方案2】:

    您使用 Directory.GetFiles(...) 的初始尝试失败,因为“?”通配符允许在指定位置包含 0 或 1 个字符。为了做你想做的事,你基本上必须使用正则表达式。

    旁注,您可以将正则表达式简化为“\w{2}_\w+Wrk\w{2,3}\d{12}.([mM]4[tT])”

    【讨论】:

    • 我忘记了其中一些元字符。谢谢你的建议。我会用它们更新我的表达方式。
    猜你喜欢
    • 2022-12-10
    • 2022-01-21
    • 2017-03-13
    • 2011-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多