2011-12-24 6 views
0

階層内の特定のレベル、具体的にはすべてのサブサブフォルダ内のすべてのファイルを反復処理しようとしています。ファイルを実際に操作する前に、すべてのファイルを数えてプログレスバーを表示したいと思っています。つまり、反復メソッドを2回呼び出す必要があります。これは関連するコードです。私は今使っています:特定のレベルのファイルを繰り返します。

Iterate(bool count) 
    { 
     foreach (string dir in Directory.GetDirectories(root)) 
      foreach (string subdir in Directory.GetDirectories(dir)) 
      foreach (string file in Directory.GetFiles(subdir)) 
      { 
       if (count) progressBar.Maximum++;   
       else 
       { 
        //do operations 
       } 
      } 
    } 

私はこれを行うより良い方法があるのだろうかと思います。確かに、すべてのフォルダレベルにforeachを追加するよりも良い方法が必要です。

string [] fileEntries = Directory.GetFiles(subdir); 
int intFileCount = fileEntries.length; 

をまたはループファイルのみをカウントするように機能するかどうかは、それを置き換えることができます。

+0

最も内側の 'foreach'ループはrep 'GetFiles'によって返された配列の' Length() 'プロパティへの呼び出しによって結び付けられています。 –

答えて

0

を反復処理する方法を示しています。

var files = 
    (from dir in Directory.GetDirectories(root) 
    from subdir in Directory.GetDirectories(dir) 
    from f in Directory.GetFiles(subdir) 
    select f).ToList(); 

var fileCount = files.Length; 
foreach (var f in files) { 
    ... 
} 
+0

それはかなり良いです。少なくとも、それはif/elseの使用を排除します。 – Daan

0

あなたのGetFilesのforeachの前に、これを試してみてください。

0

あなたは、私がSystem.IOのために書いた流暢なものをダウンロードする(ここを参照してください:http://blog.staticvoid.co.nz/2011/11/staticvoid-io-extentions-nuget.html)の可能性があり、その後、このLINQ文を使用

 var files = from d in di.Directories() 
        from dir in d.Directories() 
        from f in dir.Files() 
        select f; 
0

書き込み、この代わりにあなたのコード

string [] files = Directory.GetFile("yourDirectory","*.*",SearchOptions.AllDirectories); 

これは再帰を使用する代わりにサブディレクトリ内のすべてのファイルを返します

+0

私は特定のレベルのファイルを繰り返し処理するだけなので、これはうまくいかないと思います。指定したフォルダ内のすべてのファイルが返されます。 – Daan

関連する問題