之前我发布了类似的内容,但它是关于处理命令提示符的。在另一个例子中,我正在尝试在ERP系统中进行备份之前进行一些自动文件清理我执行维护以平滑过程(因为我对这些系统中的六个至少两次执行维护每月)。所以,这里有一些正在发生的事情......
以下是可以显示在目录中的三个文件名:
在这三个中,第二个将是删除的候选者,第一个将需要保留。所以,最初我使用以下内容仅检索后两个:
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匹配来找到正确的文件(就像我目前正在做的那样)?
答案 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;