在 .NET 中执行 stream.CopyTo(anotherStream) 时如何获得复制百分比?

Pur*_*ome 1 .net c# streaming

我有两个流,我希望将内容从一个复制到另一个。

例如。 await stream1.CopyToAsync(stream2);

有没有办法可以挂钩一个事件,以便对于每个.. 说.. 10K 字节复制,我报告一些东西.. 或每复制 1% 或其他东西.. 我会触发一个事件?

看一些例子,他们都建议我不要使用该CopyTo / CopyToAsync方法,而是恢复到使用固定数组手动从stream=>stream2手动复制数据的经典方法。

spe*_*der 6

您必须编写自己的方法,也许作为扩展方法。它可能看起来像这样:

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 );
}
Run Code Online (Sandbox Code Playgroud)

你会这样称呼它:

stream1.CopyToWithProgressAsync(stream2, 
                                4096, 
                                amtCopied => Console.WriteLine(amtCopied))
Run Code Online (Sandbox Code Playgroud)