2016-03-19 3 views
0

この2つの方法では、GetDirectoriesとMyGetDirectoriesはすべてのディレクトリとサブディレクトリを再帰的に取得しています。私は、ラベルの終わりまでディレクトリの数を数えるカウンタのように、progresschangedイベントのlabel2に表示したいと思います。ディレクトリの数をリアルタイムでbackgroundworker progresschangedイベントに報告するにはどうすればよいですか?

private void _FileInformationWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      MySubDirectories = GetDirectories(BasePath).ToArray(); 
     } 

     private void _FileInformationWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 

     } 

その後GetDirectoriesメソッド

private List<DirectoryInfo> GetDirectories(string basePath) 
     { 
      IEnumerable<string> str = MyGetDirectories(basePath); 

      List<DirectoryInfo> l = new List<DirectoryInfo>(); 
      l.Add(new DirectoryInfo(basePath)); 

      IEnumerable<DirectoryInfo> dirs = str.Select(a => new DirectoryInfo(a)); 
      l.AddRange(dirs); 

      return l; 
     } 

そしてメソッドMyGetDirectories

private static IEnumerable<string> MyGetDirectories(string basePath) 
     { 
      try 
      { 
       string[] dirs = Directory.GetDirectories(basePath); 
       return dirs.Union(dirs.SelectMany(dir => MyGetDirectories(dir))); 
      } 
      catch (UnauthorizedAccessException) 
      { 
       return Enumerable.Empty<string>(); 
      } 
     } 

私が試したことは、私は、変数countDirectoriesと呼ばれるカウンタを追加し、私はそれがない確認方法MyGetDirectoriesでありますカウント。

static int countDirectories = 0; 
     private static IEnumerable<string> MyGetDirectories(string basePath) 
     { 
      try 
      { 
       string[] dirs = Directory.GetDirectories(basePath); 
       countDirectories = countDirectories + dirs.Length; 
       return dirs.Union(dirs.SelectMany(dir => MyGetDirectories(dir))); 
      } 
      catch (UnauthorizedAccessException) 
      { 
       return Enumerable.Empty<string>(); 
      } 
     } 
私がやったDoWorkイベントで、その後

private void _FileInformationWorker_DoWork(object sender, DoWorkEventArgs e) 
     { 
      MySubDirectories = GetDirectories(BasePath).ToArray(); 
      _FileInformationWorker.ReportProgress(0,countDirectories.ToString()); 
     } 

そしてprogresschangedイベントで

private void _FileInformationWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      label2.Text = e.UserState.ToString(); 
     } 

しかし、それはまだ内部で働いているので、私は推測LABEL2何にも報告していませんGetDirectoriesメソッド。だから私はここで立ち往生している。

答えて

0

これは、その上にちょうどボタンとラベルを持つフォームのコードです:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.IO; 

namespace WindowsFormsApplication1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     DirectoryInfo[] MySubDirs; 
     BackgroundWorker w; 
     int count; 

     private void button1_Click(object sender, EventArgs e) 
     { 
      button1.Enabled = false; 
      count = 0; 
      w = new BackgroundWorker(); 
      w.DoWork += w_DoWork; 
      w.ProgressChanged += w_ProgressChanged; 
      w.WorkerReportsProgress = true; 
      w.RunWorkerCompleted += w_RunWorkerCompleted; 
      w.RunWorkerAsync(); 

     } 

     void w_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
     { 
      button1.Enabled = true; 
     } 

     void w_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      label1.Text = e.UserState.ToString(); 
     } 

     void w_DoWork(object sender, DoWorkEventArgs e) 
     { 
      MySubDirs = GetDirectories("d:\\prj").ToArray(); 
     } 

     private List<DirectoryInfo> GetDirectories(string basePath) 
     { 
      IEnumerable<string> str = MyGetDirectories(basePath); 

      List<DirectoryInfo> l = new List<DirectoryInfo>(); 
      l.Add(new DirectoryInfo(basePath)); 

      IEnumerable<DirectoryInfo> dirs = str.Select(a => new DirectoryInfo(a)); 
      l.AddRange(dirs); 

      return l; 
     } 
     //not static so we can report progress from it 
     private IEnumerable<string> MyGetDirectories(string basePath) 
     { 
      try 
      { 
       string[] dirs = Directory.GetDirectories(basePath); 
       count += dirs.Length; 
       w.ReportProgress(0, count.ToString()); 
       return dirs.Union(dirs.SelectMany(dir => MyGetDirectories(dir))); 
      } 
      catch (UnauthorizedAccessException) 
      { 
       return Enumerable.Empty<string>(); 
      } 
     } 
    } 
} 
+0

shibormotありがとう私は答えとしてマークします。別の質問がありますが、新しい質問を開くかどうかはわかりません。ディレクトリ数の報告が今行われています。しかし、ディレクトリMySubDirsにディレクトリをリアルタイムで報告したいのであればどうでしょうか?私は今あなたのコードで私のコードで私たちはMySubDirsがnullではなく、内部のディレクトリを終了するディレクトリを取得するのを待つ必要があることを意味します。しかし、私はMySubDirsを扱うために別のバックグラウンドワーカーを使用しています。 –

+0

MysubDirsにすでにあるディレクトリを報告し、埋め尽くしているかもしれません。私がやっていることは、別のバックグラウンドワーカーのMySubDirsのディレクトリをループして、MySubDirsにあるこのディレクトリを検索することです。最初のバックグラウンドワーカーがプロセスを終了する前に、2番目のバックグラウンドワーカーを開始してMySubDirsで作業するにはどうすればいいのでしょうか。 –

+0

短い質問ではないので、新しい質問をする方が良い – shibormot

0

はあなたがtrueに次のように設定していることを確認してください:

_FileInformationWorker.RunWorkerAsync(); 

Thisの例では、同様にあなたの仕事のお手伝いをする必要があります。

_FileInformationWorker.WorkerReportsProgress = true; 

をも必ず次のように非同期的に作業を開始します。

+0

私はすでにそれを設定します。解決策は、ReportProgress行を移動することでした。_FileInformationWorker.ReportProgressを、カウンタを更新する行の直後のMyGetDirectoriesメソッドの内側に移動することでした:countDirectories = countDirectories + dirs.Length; これは機能しています。 –

関連する問題