2011-08-16 5 views
1

私はJavaの獣医ですが、.NETでは初めてです。私は合計サイズとファイル数をタイプ別に集計し、C#で総計する必要があります。再帰検索よりも良い方法はありますか?また、私は複数のタイプを見つける必要があります。私の拡張機能をアップデートしてアップデートするのにHashTableが適切でしょうか?Cでファイルタイプとファイルサイズの合計数

void DirSearch(string sDir) 
{ 
try 
{ 
    foreach (string d in Directory.GetDirectories(sDir)) 
    { 
    FileInfo[] fiArr = d.GetFiles(); 
    foreach (string f in fiArr) 
    { 
     String ext = Path.GetExtension(f.Name); 
     if (myht.ContainsKey(ext) 
     { 
     myht[ext] = myht[ext] + f.Length; 
     } 
    } 
    DirSearch(d); 
    } 
} 
catch (System.Exception excpt) 
{ 
    Console.WriteLine(excpt.Message); 
} 
} 
+0

"より良い"と正確にはどういう意味ですか? – Mehrdad

+0

私は言うべきです。 – traigo

答えて

0

を呼び出す必要があります - あなたがが異なるファイル拡張子のセットをサポートする必要があるとの統計情報を取得したいんので、書くことが良いかもしれませんカスタムメソッドを使用すると、ディレクトリツリーを1回しか移動する必要がありません。代わりに、拡張子の列挙に基づいて一致するファイルのリストを返すだけの例の下に、あなただけの再帰を表現するためにスタックを使用することができます再帰呼び出しを使用しての

- 簡単にあなたのシナリオのためにこれを変更することができます。

public static List<string> DirSearch(string startDirectory, IEnumerable<string> extensions) 
{ 
    Stack<string> directoryStack = new Stack<string>(); 
    List<string> files = new List<string>(); 

    directoryStack.Push(startDirectory); 
    while (directoryStack.Count > 0) 
    { 
     string currentDirectory = directoryStack.Pop(); 
     DirectoryInfo di = new DirectoryInfo(currentDirectory); 
     files.AddRange(di.EnumerateFiles() 
         .Where(f => extensions.Contains(f.Extension)) 
         .Select(f => f.FullName)); 
     foreach (string directory in Directory.GetDirectories(currentDirectory)) 
      directoryStack.Push(directory); 
    } 
    return files; 
} 
+0

これを見る人のための重要な注意:f.Extensionは、ドットを含む拡張を返します。私の人生は30分かかります。 – traigo

+0

あなたは 'SearchOption.AllDirectories'を使うことができます – SLaks

1

あなたは一般的なアプローチは、@Slaksによって概説されたDirectory.EnumerateFiles(sDir, SearchOption.AllDirectories)

+0

複数のフィルタをサポートしていないようです。私は各拡張機能に対してこれを実行しますか? – traigo