2016-05-02 6 views
1

私は2つのストリームを持っており、コンテンツを1つから別のストリームにコピーしたいと考えています。.NETでstream.CopyTo(anotherStream)を実行するときにコピーパーセンテージを取得する方法?

例えば、 await stream1.CopyToAsync(stream2);

私はイベントにフックできる方法はありますか..毎回.. 10Kバイトがコピーされました。私は何かを報告します..または1%コピーしたか何かごとにイベントが発生しますか?

some examplesを見てみると、それらはすべて私がCopyTo/CopyToAsyncメソッドを使用して、代わりに手動で固定された配列を使用して、手動でstream =>stream2からデータをコピーするの古典的な方法に戻すないことを示唆しています。

答えて

1

拡張メソッドとして、独自のメソッドを記述する必要があります。それは次のようなものになります。

public static async Task CopyToWithProgressAsync(this Stream source, 
               Stream destination, 
               int bufferSize = 4096, 
               Action<long> progress = null) 
{ 
    var buffer = new byte[bufferSize]; 
    var total = 0L; 
    int amtRead; 
    do 
    { 
     amtRead = 0; 
     while(amtRead < bufferSize) 
     { 
      var numBytes = await source.ReadAsync(buffer, 
                amtRead, 
                bufferSize - amtRead); 
      if(numBytes == 0) 
      { 
       break; 
      } 
      amtRead += numBytes; 
     } 
     total += amtRead; 
     await destination.WriteAsync(buffer, 0, amtRead); 
     if(progress != null) 
     { 
      progress(total); 
     } 
    } while(amtRead == bufferSize); 
} 

を、あなたが好きそれを呼びたい:

stream1.CopyToWithProgressAsync(stream2, 
           4096, 
           amtCopied => Console.WriteLine(amtCopied)) 
+0

甘い - 私の一時コードが実際に必要がある場合はそれは(私はとにかくやってしまったものをざっとだことがちょうどわかりませんでした正当な答えになります)。私の2倍の主な違いは、1)カスタムイベントの引数を使ってカスタムイベントを発生させていました。2)代わりにこの行を使用していました。 'while((bytesRead = await source.ReadAsync(buffer、0、buffer.Length))> 0) Ta! –

関連する問題