C#中的Directory.GetFiles()模式匹配

时间:2010-12-12 19:07:46

标签: c# c#-4.0 directory-listing

我正在使用Directory.GetFiles()根据给定的模式列出文件。这适用于我正在寻找的大多数模式(例如zip,rar,sfv)。

这就是我准备列表的方式(或多或少)。问题在于我要列出的数字.001到.999的模式。

alArrayPatternText.Add("*.zip");
alArrayPatternText.Add("*.sfv");
alArrayPatternText.Add("*.r??");
alArrayPatternText.Add("*.001");
for (int i = 2; i <= 999; i++)
{
    string findNumber = String.Format("{0:000}", i);
    alArrayPatternText.Add("*." + findNumber);
}
然后我打电话给

string[] files = Directory.GetFiles(strDirName, varPattern);

对于Array中的每个模式,这似乎是一个非常糟糕的主意,因为该列表有1002个条目,并检查目录是否只是有点太耗时。

有没有更好的方法呢?

2 个答案:

答案 0 :(得分:5)

您应该调用Directory.EnumerateFiles("path", "*")然后使用LINQ通过调用Path.GetExtension来过滤路径。

例如:

var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) {
    ".zip", ".sfv"
};
extensions.UnionWith(Enumerable.Range(1, 998).Select(i => i.ToString(".000")));
var files = Directory.EnumerateFiles("path", "*")
            .Where(p => extensions.Contains(Path.GetExtension(p))
                     || Path.GetExtension(p).StartsWith(".r", StringComparison.OrdinalIgnoreCase));

答案 1 :(得分:0)

基于SLaks的最终方法可以为任何寻找类似解决方案的人提供答案

private static IEnumerable<string> DirectoryGetFiles(string strDirName, SearchOption varOption) {
var extensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { ".zip", ".sfv" };
     extensions.UnionWith(Enumerable.Range(1, 999).Select(i => String.Format(".{0:000}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".r{0:00}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".s{0:00}", i)));
     extensions.UnionWith(Enumerable.Range(1, 99).Select(i => String.Format(".t{0:00}", i)));
     return Directory.EnumerateFiles(strDirName, "*.*", varOption).Where(p => extensions.Contains(Path.GetExtension(p))).ToList();
}