How do I copy the contents of one stream to another?

后端 未结 13 2350
悲哀的现实
悲哀的现实 2020-11-21 22:11

What is the best way to copy the contents of one stream to another? Is there a standard utility method for this?

13条回答
  •  广开言路
    2020-11-21 22:43

    From .NET 4.5 on, there is the Stream.CopyToAsync method

    input.CopyToAsync(output);
    

    This will return a Task that can be continued on when completed, like so:

    await input.CopyToAsync(output)
    
    // Code from here on will be run in a continuation.
    

    Note that depending on where the call to CopyToAsync is made, the code that follows may or may not continue on the same thread that called it.

    The SynchronizationContext that was captured when calling await will determine what thread the continuation will be executed on.

    Additionally, this call (and this is an implementation detail subject to change) still sequences reads and writes (it just doesn't waste a threads blocking on I/O completion).

    From .NET 4.0 on, there's is the Stream.CopyTo method

    input.CopyTo(output);
    

    For .NET 3.5 and before

    There isn't anything baked into the framework to assist with this; you have to copy the content manually, like so:

    public static void CopyStream(Stream input, Stream output)
    {
        byte[] buffer = new byte[32768];
        int read;
        while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
        {
            output.Write (buffer, 0, read);
        }
    }
    

    Note 1: This method will allow you to report on progress (x bytes read so far ...)
    Note 2: Why use a fixed buffer size and not input.Length? Because that Length may not be available! From the docs:

    If a class derived from Stream does not support seeking, calls to Length, SetLength, Position, and Seek throw a NotSupportedException.

提交回复
热议问题