Ridurre le linee di codice è piuttosto semplice qui (mentre si lavora con i flussi arbitrarie, piuttosto che file):
using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
int byteRead;
while ((byteRead = fileStream.ReadByte()) != -1)
{
memoryStream.WriteByte(byteRead);
}
return memoryStream.ToArray();
}
Ovviamente è molto più efficiente per leggere in un buffer che per leggere un byte alla volta, ma questo riduce il numero di dichiarazioni (come si don Devo dichiarare sia un buffer e una variabile per contenere il valore di ritorno da Stream). Chiamare MemoryStream.ToArray()
è più semplice della lettura in un array di nuova costruzione.
L'utilizzo di un buffer è tuttavia più piacevole. Si noti che abbiamo davvero non abbiamo bisogno 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();
}
Se vuoi essere davvero brutale, potremmo ridurre il numero di using
dichiarazioni (con entrambe le soluzioni):
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();
}
ma questo è semplicemente brutto :)
Un'altra opzione, naturalmente, è utilizzare una libreria come MiscUtil che ha un metodo per leggere completamente da un flusso :) Il metodo di utilità può essere semplice come questo:
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();
}
}
Si noti che questo mai chiude il flusso - il chiamante deve farlo.
Non tutti gli stream restituiscono la loro lunghezza sebbene ... –
data = binaryReader.ReadBytes (stream.Length); dovrebbe essere data = br.ReadBytes (stream.Length); – OneSHOT
Sì, evviva. Errore di battitura evidente. – Noldorin