Stream.CopyTo() extension method

In one of my applications I needed copy data from one stream to another. After playing with streams a little bit I wrote CopyTo() extension method to Stream class you can use to copy the contents of current stream to target stream. Here is my extension method.

It is my working draft and it is possible that there must be some more checks before we can say this extension method is ready to be part of some API or class library.

public static void CopyTo(this Stream fromStream, Stream toStream)
{
   
if (fromStream == null
)
       
throw new ArgumentNullException("fromStream"
);
   
if (toStream == null
)
       
throw new ArgumentNullException("toStream"
);

   
var bytes = new byte
[8092];
   
int
dataRead;
   
while ((dataRead = fromStream.Read(bytes, 0, bytes.Length)) > 0)
        toStream.Write(bytes, 0, dataRead);
}

And here is example how to use this extension method.

using (var stream = response.GetResponseStream())
using (var ms = new MemoryStream
())
{
    stream.CopyTo(ms);

   
// Do something with copied data
}

I am using this code to copy data from HTTP response stream to memory stream because I have to use serializer that needs more than response stream is able to offer.

Liked this post? Empower your friends by sharing it!

Gunnar Peipman

Gunnar Peipman is ASP.NET, Azure and SharePoint fan, Estonian Microsoft user group leader, blogger, conference speaker, teacher, and tech maniac. Since 2008 he is Microsoft MVP specialized on ASP.NET.

    5 thoughts on “Stream.CopyTo() extension method

    • December 28, 2010 at 4:46 am
      Permalink

      A safety measure may be to set the fromStream Position property to 0 prior looping the stream. Learned this from experience when performing a MD5 hash to generate a file checksum prior to saving… The file was created on the IO, but it was always zero bits… Silly me, the position was at the end of the stream when performing my loop…

    • December 28, 2010 at 8:51 pm
      Permalink

      Thanks for feedback, kuujinbo. .NET Framework 3.5 and 4.0 have this method but this method is not available in some other versions of framework (it doesn’t exist in Windows Phone 7 by example).

    • July 27, 2012 at 9:12 pm
      Permalink

      That method it’s not available in Framework 3.5, only on 4.5. Thanks for the information, very helpful.

    • May 28, 2013 at 2:49 pm
      Permalink

      Somehow, in NET 4.0, this exact method ended up being instance method on System.IO.Stream class…

    Leave a Reply

    Your email address will not be published. Required fields are marked *