La reducción de sus líneas de código es bastante simple aquí (mientras trabaja con las corrientes arbitrarias, en lugar de archivos):
using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
int byteRead;
while ((byteRead = fileStream.ReadByte()) != -1)
{
memoryStream.WriteByte(byteRead);
}
return memoryStream.ToArray();
}
Obviamente es mucho más eficiente a leer en un búfer de leer un byte a la vez, pero esto reduce el número de declaraciones (como Don no es necesario declarar un buffer y una variable para contener el valor de retorno de Stream). Llamar al MemoryStream.ToArray()
es más simple que leer en una matriz recién construida.
Sin embargo, usar un buffer es más agradable. Tenga en cuenta que en realidad no necesitamos BinaryReader:
using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return memoryStream.ToArray();
}
Si quieres ser realmente brutal, que podría reducir el número de using
declaraciones (ya sea con solución):
using (Stream fileStream = File.OpenRead(fileName),
memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return ((MemoryStream)memoryStream).ToArray();
}
pero eso es simplemente desagradable :)
Otra opción, por supuesto, es utilizar una biblioteca como MiscUtil que tiene un método para leer completamente desde una secuencia :) El método de utilidad puede ser tan simple como esto:
public static byte[] ReadFully(this Stream stream)
{
using (MemoryStream memoryStream = new MemoryStream())
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
{
memoryStream.Write(buffer, 0, bytesRead);
}
return memoryStream.ToArray();
}
}
Tenga en cuenta que este no cierra la corriente - la persona que llama debe hacer eso.
No todas las secuencias devuelven su longitud ... –
data = binaryReader.ReadBytes (stream.Length); debe ser data = br.ReadBytes (stream.Length); – OneSHOT
Sí, aplausos. Obvio error tipográfico – Noldorin