May 222009
I found this method, I’ve used it a few times, so I’m going to put it here for my own use.
/// <summary>
/// Reads data from a stream until the end is reached. The
/// data is returned as a byte array. An IOException is
/// thrown if any of the underlying IO calls fail.
/// </summary>
/// <param name="stream">The stream to read data from</param>
/// <param name="initialLength">The initial buffer length</param>
public static byte[] ReadFully (Stream stream, int initialLength)
    // If we've been passed an unhelpful initial length, just
    // use 32K.
    if (initialLength < 1)
        initialLength = 32768;

    byte[] buffer = new byte[initialLength];
    int read=0;

    int chunk;
    while ( (chunk = stream.Read(buffer, read, buffer.Length-read)) > 0)
        read += chunk;

        // If we've reached the end of our buffer, check to see if there's
        // any more information
        if (read == buffer.Length)
            int nextByte = stream.ReadByte();

            // End of stream? If so, we're done
            if (nextByte==-1)
                return buffer;

            // Nope. Resize the buffer, put in the byte we've just
            // read, and continue
            byte[] newBuffer = new byte[buffer.Length*2];
            Array.Copy(buffer, newBuffer, buffer.Length);
            buffer = newBuffer;
    // Buffer is now too big. Shrink it.
    byte[] ret = new byte[read];
    Array.Copy(buffer, ret, read);
    return ret;

  • Actiognosaurus

    Nice and clean

  • Easier way

    public static byte[] ReadFully (Stream stream)
    var read = new BinaryReader(stream);
    var ms = new MemoryStream();
    while (stream.CanRead)
    var buff = read.ReadBytes(16024);
    ms.Write(buff, 0, buff.Length);
    return ms.ToArray();

  • This is such a wonderful useful resource that you’ll be providing You got so many points here, that’s why i love reading your post. Thank you so much!