C# C语言中的文件名匹配问题#

C# C语言中的文件名匹配问题#,c#,regex,file,getfiles,C#,Regex,File,Getfiles,我以前也发布过类似的东西,但它是关于处理命令提示符的。正如在另一个例子中一样,我正在尝试在对一个ERP系统执行维护之前进行一些自动文件清理,以使流程更加顺畅(因为我每个月至少对其中的六个系统执行两次维护)。下面是一些正在发生的事情的例子 以下是目录中可能显示的三个文件名: AP_AnalysisWrk.M4T AP_分析WRKMPM20140821313.M4T AP_AnalysisWRKNG20140821313.M4T 在这三个选项中,第二个选项将被删除,第一个选项需要保留。因此,最初

我以前也发布过类似的东西,但它是关于处理命令提示符的。正如在另一个例子中一样,我正在尝试在对一个ERP系统执行维护之前进行一些自动文件清理,以使流程更加顺畅(因为我每个月至少对其中的六个系统执行两次维护)。下面是一些正在发生的事情的例子

以下是目录中可能显示的三个文件名:

  • AP_AnalysisWrk.M4T
  • AP_分析WRKMPM20140821313.M4T
  • AP_AnalysisWRKNG20140821313.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过滤文件名,或者我只是通过迭代目录结果和使用正则表达式匹配来查找正确的文件(就像我目前所做的那样)更好

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

  • *
    (星号):该位置有零个或多个字符
  • (问号):该位置为零或一个字符
鉴于此,
AP\u AnalysisWrk.M4T
确实匹配
??\u*Wrk??????.M4T
,因为结尾的所有
??*??
字符都可以匹配空字符串


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

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


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

命令提示符可能也是如此。我认为Windows资源管理器和C#会以同样的方式处理“?”通配符,这是对的。我将修改我的代码,以便更有效地使用正则表达式。谢谢。使用
Directory.GetFiles()
进行粗略的初始筛选不是一个坏主意。我记得当访问映射的网络驱动器时,过滤是在服务器上完成的,这在一定程度上减少了扫描大型目录的网络流量。这实际上是在托管文件的服务器上直接执行的,因此网络流量没有问题。但是,即使是在映射驱动器上进行,网络流量也不是问题,因为工作是在深夜进行的,而此时网络大部分处于空闲状态。我想在这种情况下,网络速度可能会是一个更大的问题。在任何情况下,每次清除的文件数量从700-800个左右,总共是3GB到10GB。我忘记了一些元字符。谢谢你的建议。我将用它们更新我的表达式。