c#中文件名匹配的问题
本文关键字:问题 中文 文件名 | 更新日期: 2023-09-27 18:19:05
我以前发布过类似的东西,但它是关于处理命令提示符的。在另一个例子中,我试图在我维护的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匹配来找到正确的文件(就像我目前所做的)?
来自Directory.GetFiles Method (String, String)
的文档
searchPattern可以是文字和通配符的组合,但不支持正则表达式。在searchPattern中允许使用以下通配符。
*
(星号):该位置为零个或多个字符。?
(问号):该位置为0或1个字符。
给定,AP_AnalysisWrk.M4T
匹配??_*Wrk??*????????????.M4T
,因为末尾的所有??*????????????
字符都可以匹配空字符串。
因此,您可以使用Directory.GetFiles()
进行粗略的初始匹配,然后使用Regex更精确地过滤返回。
使用Directory.GetFiles(…)的初始尝试失败,因为'?'通配符允许在指定位置使用0或1个字符。要做你想做的,你基本上必须使用一个正则表达式。
旁注,您可以将正则表达式简化为"'w{2}_'w+ wk 'w{2,3}'d{12}.([mM]4[tT])"。"