我有两个流,我希望将内容从一个流复制到另一个流。
例如。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))