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