C#中文件名匹配的问题

时间:2014-08-21 19:52:51

标签: c# regex file getfiles

之前我发布了类似的内容,但它是关于处理命令提示符的。在另一个例子中,我正在尝试在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匹配来找到正确的文件(就像我目前正在做的那样)?

2 个答案:

答案 0 :(得分:1)

来自Directory.GetFiles Method (String, String)

的文档
  

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

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

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

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

答案 1 :(得分:1)

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

旁注,您可以将正则表达式简化为" \ w {2} _ \ w + Wrk \ w {2,3} \ d {12}。([mM] 4 [tT])& #34;