Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Any way to use Stream.CopyTo to copy only certain number of bytes?

Tags:

c#

Is there any way to use Stream.CopyTo to copy only certain number of bytes to destination stream? what is the best workaround?

Edit:
My workaround (some code omitted):

internal sealed class Substream : Stream 
    {
        private readonly Stream stream; 
        private readonly long origin;   
        private readonly long length; 
        private long position;        

        public Substream(Stream stream, long length)
        {
            this.stream = stream;
            this.origin = stream.Position;
            this.position = stream.Position;
            this.length = length;            
        }

public override int Read(byte[] buffer, int offset, int count)
        {
            var n = Math.Max(Math.Min(count, origin + length - position), 0);                
            int bytesRead = stream.Read(buffer, offset, (int) n);
            position += bytesRead;
            return bytesRead;            
        }
}

then to copy n bytes:

var substream = new Substream(stream, n);
                substream.CopyTo(stm);
like image 435
morpheus Avatar asked Oct 23 '12 00:10

morpheus


1 Answers

The implementation of copying streams is not overly complicated. If you want to adapt it to copy only a certain number of bytes then it shouldn't be too difficult to tweak the existing method, something like this

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

The check for bytes > 0 probably isn't strictly necessary, but can't do any harm.

like image 120
Justin Avatar answered Oct 13 '22 09:10

Justin