17

I have the following code to read data from a Stream (in this case, from a named pipe) and into a byte array:

// NPSS is an instance of NamedPipeServerStream

int BytesRead;
byte[] StreamBuffer = new byte[BUFFER_SIZE]; // size defined elsewhere (less than total possible message size, though)
MemoryStream MessageStream = new MemoryStream();

do
{
    BytesRead = NPSS.Read(StreamBuffer, 0, StreamBuffer.Length);
    MessageStream.Write(StreamBuffer, 0, BytesRead);
} while (!NPSS.IsMessageComplete);

byte[] Message = MessageStream.ToArray(); // final data

Could you please take a look and let me know if it can be done more efficiently or neatly? Seems a bit messy as it is, using a MemoryStream. Thanks!

Frank Hamming
  • 171
  • 1
  • 2
  • 6

3 Answers3

23

Shamelessly copied from Jon Skeet's article.

public static byte[] ReadFully (Stream stream)
{
   byte[] buffer = new byte[32768];
   using (MemoryStream ms = new MemoryStream())
   {
       while (true)
       {
           int read = stream.Read (buffer, 0, buffer.Length);
           if (read <= 0)
               return ms.ToArray();
           ms.Write (buffer, 0, read);
       }
   }
}
David Neale
  • 16,498
  • 6
  • 59
  • 85
  • 1
    This reads to the end of the stream, but the intent is to only read until `IsMessageComplete`. – Stephen Cleary Jun 18 '10 at 12:34
  • 1
    Thanks for the link to the article; it looks like I'm doing pretty much the same algorithm but with a different terminating condition on the loop. – Frank Hamming Jun 18 '10 at 12:40
3
int read = stream.Read (buffer, 0, buffer.Length);

This line will block forever if there is no data Available. Read is a blocking function and it will block the thread until it reads at least one byte but if there is no data then it will block forever.

Derek Beattie
  • 9,429
  • 4
  • 30
  • 44
Abhinaw Sharma
  • 676
  • 5
  • 8
1

It looks like your current solution is pretty good. You may consider wrapping it up into an extension method if you'd like the code to look cleaner.

Stephen Cleary
  • 437,863
  • 77
  • 675
  • 810