2010-12-12 128 views
5

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

这是我如何准备清单(或多或少)。问题是我想列出的.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); 

在阵列这似乎是非常糟糕的主意,这样做,因为列表中有1002项和检查,如果目录已每个人只是有点每个模式太耗时。

会有更好的方法来做到这一点吗?

回答

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)); 
+0

谢谢,这应该这样做:-) – MadBoy 2010-12-12 19:20:41

+0

Hrmms,似乎有什么东西错误,000-999不能很好地转换。它显示为1,000 2,000等,甚至你的目录有zip文件和001不会返回任何文件..:/ – MadBoy 2010-12-12 20:50:59

+0

可能是一个字符串格式问题。尝试替换:i => i.ToString(“。000”):i =>“。” + i – 2010-12-12 21:35:04

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(); 
}