2017-02-06 142 views
14

我读过关于Directory.GetPath搜索模式的文档以及它是如何使用的,因为我注意到*.dll找到test.dlltest.dll_20170206。这种行为是记录对Directory.GetFiles感到困惑

现在,我有一个程序,基于用户配置的掩码列出文件夹中的文件并进行处理。我注意到像*.txt这样的面具如预期的那样导致了上述“问题”。

然而,面具fixedname.txt也导致fixedname.txt_20170206等,以出现在列表中,即使文档状态当您使用星号通配符的是searchPattern如“*这只发生

。 txt“

这是为什么?

PS:我刚才检查:文件掩码更改为fixednam?.txt没有帮助,即使文档说

当您使用问号通配符,这种方法只返回匹配指定文件扩展名的文件。例如,在目录中给定两个文件“file1.txt”和“file1.txtother”,“file?.txt”的搜索模式只返回第一个文件,而搜索模式“file * .txt”返回这两个文件。

+0

我可以用'*'前缀来重现这个问题,但不能用'?' - '?????????。txt'只能匹配'fixedname.txt' –

+0

我不能重现这个。尝试这2行:'var a = Directory.GetFiles(@“c:\ temp”,“fixedname.txt”);'和'var a = Directory.GetFiles(@“c:\ temp”,“fixednam ?. txt“);'他们只是返回一个文件,而不是'fixedname.txt_20170206' – Pikoh

+1

有趣......我用文件''Rename-Plan.txt”'和''Rename-Plan.txt12“'试过了你的问题。 '' - “'模式与没有它的模式之间有区别。 ''Rename-Plan.txt''返回1,''Rename - *。txt''return 1,''Rename * .txt''返回2,''Rename?Plan.txt''返回1,''重命名????? txt“'返回2.你得到的模式我猜 – grek40

回答

1

GetFiles的使用模式检索算法,它将搜索路径与特定字母结尾的名称。

你可以写类似下面的代码如果需要你可以通过.通过(.*)?更换*变换过滤模式为正则表达式的解决方案只得到扩展名为.txt文件

foreach (string strFileName in Directory.GetFiles(@"D:\\test\","*.txt")) 
      { 
       string extension; 
       extension = Path.GetExtension(strFileName); 

       if (extension != ".txt") 
        continue; 
       else 
       { 
        //processed the file 
       } 
      } 
+0

所有不错,如果你知道你在找什么。如果允许用户自己定义掩码,则不可能。 –

2

。你也必须逃离一些模式字符,如点。然后,检查从Directory.GetFiles获得的每个文件名与此正则表达式的对应关系。请记住,不仅要检查它是否匹配,而且匹配长度等于文件名的长度。否则,你会得到和以前一样的结果。

+0

我已经实际完成了,并且它工作。我仍然想知道为什么在这个特定的工具中,当我无法再现它时,我有这个问题... –