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.
View Comments (5)
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...
Microsoft finally realized they should have included something exactly like this in .NET 4:
Stream.CopyTo Method(Stream)
http://msdn.microsoft.com/en-us/library/dd782932.aspx
Stream.CopyTo Method (Stream, Int32)
http://msdn.microsoft.com/en-us/library/dd783870.aspx
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).
That method it's not available in Framework 3.5, only on 4.5. Thanks for the information, very helpful.
Somehow, in NET 4.0, this exact method ended up being instance method on System.IO.Stream class...