Una forma elegante de consumir (todos los bytes de un) BinaryReader?

¿Hay StreamReader.ReadToEnd método elegante para emular el método StreamReader.ReadToEnd con BinaryReader ? ¿Quizás para poner todos los bytes en una matriz de bytes?

Hago esto:

 read1.ReadBytes((int)read1.BaseStream.Length); 

… pero debe haber una mejor manera.

Simplemente hazlo:

 byte[] allData = read1.ReadBytes(int.MaxValue); 

La documentación dice que leerá todos los bytes hasta que se llegue al final de la secuencia.


Actualizar

Aunque esto parece elegante, y la documentación parece indicar que esto funcionaría, la implementación real (marcada en .NET 2, 3.5 y 4) asigna una matriz de bytes de tamaño completo para los datos, lo que probablemente causará una OutOfMemoryException en un Sistema de 32 bits.

Por lo tanto, diría que en realidad no hay una manera elegante .

En cambio, recomendaría la siguiente variación de la respuesta de @ iano. Esta variante no se basa en .NET 4:
Cree un método de extensión para BinaryReader (o Stream , el código es el mismo para cualquiera).

 public static byte[] ReadAllBytes(this BinaryReader reader) { const int bufferSize = 4096; using (var ms = new MemoryStream()) { byte[] buffer = new byte[bufferSize]; int count; while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) ms.Write(buffer, 0, count); return ms.ToArray(); } } 

No hay una manera fácil de hacer esto con BinaryReader. Si no conoce el conteo que necesita leer con anticipación, una mejor opción es usar MemoryStream:

 public byte[] ReadAllBytes(Stream stream) { using (var ms = new MemoryStream()) { stream.CopyTo(ms); return ms.ToArray(); } } 

Para evitar la copia adicional al llamar a ToArray() , en su lugar puede devolver la Position y el búfer, a través de GetBuffer() .

Para copiar el contenido de una secuencia a otra, he resuelto leer “algunos” bytes hasta que se alcanza el final del archivo:

 private const int READ_BUFFER_SIZE = 1024; using (BinaryReader reader = new BinaryReader(responseStream)) { using (BinaryWriter writer = new BinaryWriter(File.Open(localPath, FileMode.Create))) { int byteRead = 0; do { byte[] buffer = reader.ReadBytes(READ_BUFFER_SIZE); byteRead = buffer.Length; writer.Write(buffer); byteTransfered += byteRead; } while (byteRead == READ_BUFFER_SIZE); } } 

Otro enfoque para este problema es usar los métodos de extensión de C #:

 public static class StreamHelpers { public static byte[] ReadAllBytes(this BinaryReader reader) { // Pre .Net version 4.0 const int bufferSize = 4096; using (var ms = new MemoryStream()) { byte[] buffer = new byte[bufferSize]; int count; while ((count = reader.Read(buffer, 0, buffer.Length)) != 0) ms.Write(buffer, 0, count); return ms.ToArray(); } // .Net 4.0 or Newer using (var ms = new MemoryStream()) { stream.CopyTo(ms); return ms.ToArray(); } } } 

El uso de este enfoque permitirá tanto el código reutilizable como el legible.