我需要列出目录中匹配某种模式的文件。
我尝试使用 Directory.GetFiles
,但没有完全
了解它为什么以某种方式表现。
1) 例如这段代码:
string[] dirs = Directory.GetFiles(@"c:\test\", "*t");
foreach (string dir in dirs)
{
Debugger.Log(0, "", dir);
Debugger.Log(0, "", "\n");
}
输出这个:
c:\test\11.11.2007.txtGif
c:\test\12.1.1990.txt
c:\test\2.tGift
c:\test\2.txtGif
c:\test\test.txt
...others hidden
您可以看到一些文件以 f
结尾,但仍被查询返回,为什么?
2) 另外,这个:
string[] dirs = Directory.GetFiles(@"c:\test\", "*.*.*.txt");
foreach (string dir in dirs)
{
Debugger.Log(0, "", dir);
Debugger.Log(0, "", "\n");
}
返回这个:
c:\test\1.1.1990.txt
c:\test\1.31.1990.txt
c:\test\12.1.1990.txt
c:\test\12.31.1990.txt
但是根据文档 ( http://msdn.microsoft.com/en-us/library/07wt70x2(v=vs.110).aspx ) 我认为它也必须返回 这个文件在目录中:
11.11.2007.txtGif
因为扩展名(在查询字符串中)是 3 个字母长, 但它没有。为什么? (当查询扩展为 3 个字母时,doc 说它也会返回以指定扩展开头的扩展,例如,请参阅备注)。
难道只有我一个人觉得这些结果很奇怪吗?
当您想要列出文件夹中与特定模式匹配的文件时,您是否会推荐使用其他方法?
在我的例子中,用户可能会任意输入一些模式,我不想依赖 我不确定结果的方法(就像 GetFiles 发生的那样)。
最佳答案
这就是 Windows API 的工作方式 - 如果您在命令提示符下使用 dir
命令,您将看到相同的结果。这不使用正则表达式!这很晦涩...
如果你想做自己的过滤,你可以这样做:
var filesEndingInT = Directory.EnumerateFiles(@"c:\test\").Where(f => f.EndsWith("t"));
如果想使用正则表达式匹配,可以这样:
Regex regex = new Regex(".*t$");
var matches = Directory.EnumerateFiles(@"c:\test\").Where(f => regex.IsMatch(f));
我怀疑您想让用户输入简化形式的模式并将其转换为正则表达式,例如
"*.t" -> ".*t$"
查找所有以 t 结尾的文件名的正则表达式是“.*t$”:
.*t$
关于c# - 列出文件夹中匹配模式的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25739767/