2013-05-17 13 views
5

サブディレクトリも考慮に入れて、特定のディレクトリ下のすべてのファイルをリストアしようとしています。私はこれをクラブと呼ぶことができます(私は.NET 3.5を使用していることに注意してください)。列挙型を使用してフォルダ内のすべてのファイルを検索する

以下

は私のコードです:

IEnumerable<string> Search(string sDir) 
{ 
     foreach (var file in Directory.GetFiles(sDir)) 
     { 
      yield return file;     
     } 

     foreach (var directory in Directory.GetDirectories(sDir)) 
     { 
       Search(directory);     
     } 
} 

私はここで間違って起こっているのか分からないが、それは唯一のルートディレクトリの下に一つである(一つのファイルを返し、一つだけのようにそこにありますよく)。あなたは助けてもらえますか?

+12

ホイールを改造しないでください。 'Directory.EnumerateFiles'と' Directory.EnumerateDirectories'を使います。 – Oded

+0

ああ、おそらくここの問題の1つである '検索(ディレクトリ)'を 'yield return 'していません。 – Oded

+0

Thanks Oded..will Directory.EnumerateFilesとDirectory.EnumerateDirectoriesは.NEt 3.5で動作しますか? – Mike

答えて

12

は、あなたがそうでなければあなただけ離れてその結果を投げている、再帰検索の結果を得るために必要があります。

IEnumerable<string> Search(string sDir) 
{ 
    foreach (var file in Directory.GetFiles(sDir)) 
    { 
     yield return file;     
    } 

    foreach (var directory in Directory.GetDirectories(sDir)) 
    { 
     foreach(var file in Search(directory)) 
      yield return file; 
    } 
} 

注意をそのあなたの意図は、単純にすべてのファイルのフラットなリストを取得する場合、サブディレクトリをすべて検索するオプションではなく、Directory.GetFilesを使用することを検討してください。検索基準を適用するためにLINQ(または他の方法)を利用することが意図されている場合は、検索されるファイルの総数に制限があります。これはディレクトリを一度に1つずつ読み込み、あなたの基準を満たしました。

+5

[Directory.GetFiles(String、String、 SearchOption)](http://msdn.microsoft.com/en-us/library/ms143316.aspx)が適切でしょうか? –

+0

技術の頂点を持つエンコーディング。 – lsalamon

+0

いくつかの点で、.Net 4バージョンは、アクセス不可能なシステムフォルダのために例外を処理する簡単な方法がないため、独自のバージョンを書くことは.Net 4以降でも便利です。少なくとも自分がロールしている場合は、適切な処理を追加することができます。しかし、.Net 3.5 *はJohn Hが言うように 'Directory.GetFiles(string、string、SearchOption) 'を持っています!しかし、私はこれがより好きです。 –

関連する問題