Thursday 9 November 2017

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

From .NET 4.5 on, there is the href="http://msdn.microsoft.com/en-us/library/system.io.stream.copytoasync.aspx"
rel="noreferrer">Stream.CopyToAsync
method


input.CopyToAsync(output);

This
will return a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.task.aspx"
rel="noreferrer">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 href="http://msdn.microsoft.com/en-us/library/system.threading.synchronizationcontext.aspx"
rel="noreferrer">SynchronizationContext that was
captured when calling href="http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx"
rel="noreferrer">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
rel="noreferrer">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 href="https://docs.microsoft.com/en-us/dotnet/api/system.io.stream.canseek"
rel="noreferrer">docs:


readability="10">

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


No comments:

Post a Comment

php - file_get_contents shows unexpected output while reading a file

I want to output an inline jpg image as a base64 encoded string, however when I do this : $contents = file_get_contents($filename); print &q...