Réduire vos lignes de code est assez simple ici (tout en travaillant avec des flux arbitraires, plutôt que des fichiers):
using (Stream fileStream = File.OpenRead(fileName))
using (MemoryStream memoryStream = new MemoryStream())
{
int byteRead;
while ((byteRead = fileStream.ReadByte()) != -1)
{
memoryStream.WriteByte(byteRead);
}
return memoryStream.ToArray();
}
de toute évidence, il est beaucoup plus efficace à lire dans un tampon que de lire un octet à la fois, mais cela réduit le nombre de déclarations (comme vous don pas besoin de déclarer à la fois un tampon et une variable pour contenir la valeur de retour de Stream). Appeler MemoryStream.ToArray()
est plus simple que de lire dans un tableau nouvellement construit. L'utilisation d'un tampon est cependant plus agréable. Notez que nous ne avons pas vraiment besoin 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 vous voulez être vraiment brutale, nous pourrions réduire le nombre de using
déclarations (soit avec solution):
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();
}
Mais c'est juste méchant :)
Une autre option est bien sûr d'utiliser une bibliothèque telle que MiscUtil qui a une méthode pour lire entièrement à partir d'un flux :) La méthode utilitaire peut être aussi simple que ceci:
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();
}
}
Notez que ce ne ferme le flux - l'appelant doit faire.
Tous les flux ne renvoient pas leur longueur si ... –
data = binaryReader.ReadBytes (stream.Length); devrait être data = br.ReadBytes (stream.Length); – OneSHOT
Oui, bravo. Typo évident. – Noldorin