2010-12-12 20 views
5

私はDirectory.GetFiles()を使用して、指定されたパターンに従ってファイルをリストしています。これは、私が探しているほとんどのパターン(zip、rar、sfvなど)でうまく動作します。CでのDirectory.GetFiles()パターンの一致

これはリストを作成する方法です(多かれ少なかれ)。問題は、リストにしたい番号.001〜.999のパターンです。私は、ディレクトリは、それらのそれぞれが少しだけありました場合は、リストは1002件のエントリーがあり、チェックするため、そうするために非常に悪いアイデアだと思いアレイ内の各パターンについて

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

を呼び出す

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

あまりにも時間がかかります。

もっと良い方法がありますか?

答えて

5

Directory.EnumerateFiles("path", "*")を呼び出し、LINQを使用してPath.GetExtensionを呼び出してパスをフィルタする必要があります。例えば

:SLaksに基づいて

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

+0

Hrmms :-)それを行う必要があり、何かがあるように思われます間違って、000-999はうまく変換されません。それは1,000 2,000などとして表示され、あなたもzipファイルを持っています001はファイルの何も返しません../ – MadBoy

+0

おそらく文字列形式の問題。 i => i.ToString( "。000")を次のように置き換えてみてください。i => "。" + i –

0

私の最後の方法は、同様の解決のために

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(); 
} 
関連する問題