2016-06-15 4 views
0
public class DirectoryIterator 
     { 
      public static int Iterate(string root) 
      { 
       var iterator = new DirectoryIterator(); 
       iterator.iterate(root); 
       return iterator.count; 
      } 

      private void iterate(string root) 
      { 
       try 
       { 
        foreach (string directory in Directory.EnumerateDirectories(root)) 
         iterate(directory); 

        foreach (string file in Directory.EnumerateFiles(root, "*.txt")) 
        { 
         // load(file); 

         ++count; 

         // Now count is the actual number of files processed, 
         // so you can use it for updateProgress() 
        } 
       } 
       catch 
       { 

       } 
      } 

      private int count; 

      private DirectoryIterator() { } 
     } 

そして、それを使用して:進捗状況を静的クラスのラベルまたは背景担当者に報告するにはどうすればよいですか?

int count = DirectoryIterator.Iterate("C:\\temp\\"); 

をそれから私は、カウントを報告することができますが、それはプロセスの最後にあります。 進捗状況を2回報告したいと思います。それはディレクトリを取得の最初の時間:

foreach (string directory in Directory.EnumerateDirectories(root)) 
         iterate(directory); 

progresschangedイベントに、ここでディレクトリ名を報告するようにしても、ディレクトリの数をカウントし、リアルタイムでカウントを報告します。

第二:

foreach (string file in Directory.EnumerateFiles(root, "*.txt")) 
        { 
         // load(file); 

         ++count; 

         // Now count is the actual number of files processed, 
         // so you can use it for updateProgress() 
        } 

ここでリアルタイムでのファイル名やファイルの数を報告すること。

問題は静的なので、私はクラスの中から、背景労働者ではなく、ラベルではないコントロールを呼び出すことはできません。

答えて

2

static Iterateメソッドにコールバックのパラメータを追加します。インスタンスiterateメソッド内の適切なコールバックを呼び出して、呼び出し元に進行状況の更新を通知します。

コールバックを受け入れるクラスDirectoryIteratorでプライベートコンストラクタも必要です。例えば:

public static int Iterate(string root, Action<int> callback) 
{ 
    var iterator = new DirectoryIterator(callback); 
    iterator.iterate(root); 
    return iterator.count; 
} 

あなたがする必要があるすべては現在の反復回数を報告している場合、コールバックはAction<int>ような単純なものでした。

関連する問題