簡體   English   中英

在.NET中執行stream.CopyTo(anotherStream)時如何獲得復制百分比?

[英]How to get a copy-percent when doing a stream.CopyTo(anotherStream) in .NET?

我有兩個流,希望將內容從一個流復制到另一個流。

例如。 await stream1.CopyToAsync(stream2);

有沒有一種方法可以掛接到事件中,以便每復制一個..例如.. 10K字節,我報告某事..或每復制1%某事。..我會觸發一個事件?

一些示例 ,它們都建議我不要使用CopyTo / CopyToAsync方法,而應恢復為使用固定數組從stream => stream2手動手動復制數據的經典方式。

您可能必須編寫自己的方法,也許作為擴展方法。 它可能看起來像這樣:

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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM