Reputation: 171
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!
Upvotes: 17
Views: 13495
Reputation: 17048
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);
}
}
}
Upvotes: 23
Reputation: 676
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.
Upvotes: 3
Reputation: 457402
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.
Upvotes: 1