Cela dépend vraiment de votre confiance s.Length
. Pour de nombreux flux, vous ne savez tout simplement pas combien de données il y aura. Dans de tels cas - et avant .NET 4 - j'utiliserais du code comme ceci:
public static byte[] ReadFully(Stream input)
{
byte[] buffer = new byte[16*1024];
using (MemoryStream ms = new MemoryStream())
{
int read;
while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
{
ms.Write(buffer, 0, read);
}
return ms.ToArray();
}
}
Avec .NET 4 et supérieur, j'utiliserais Stream.CopyTo
, ce qui est fondamentalement équivalent à la boucle dans mon code - créez le MemoryStream
, appelez stream.CopyTo(ms)
puis revenez ms.ToArray()
. Travail accompli.
Je devrais peut-être expliquer pourquoi ma réponse est plus longue que les autres. Stream.Read
ne garantit pas qu'il lira tout ce qu'il a demandé. Si vous lisez un flux réseau, par exemple, il peut lire la valeur d'un paquet puis revenir, même s'il y aura bientôt plus de données. BinaryReader.Read
continuera jusqu'à la fin du flux ou à votre taille spécifiée, mais vous devez toujours connaître la taille pour commencer.
La méthode ci-dessus continuera à lire (et à copier dans a MemoryStream
) jusqu'à ce qu'il n'y ait plus de données. Il demande ensuite à MemoryStream
de renvoyer une copie des données dans un tableau. Si vous connaissez la taille pour commencer - ou pensez que vous connaissez la taille, sans être sûr - vous pouvez construire la MemoryStream
taille pour commencer. De même, vous pouvez mettre un chèque à la fin, et si la longueur du flux est de la même taille que le tampon (renvoyé par MemoryStream.GetBuffer
), vous pouvez simplement retourner le tampon. Le code ci-dessus n'est donc pas tout à fait optimisé, mais sera au moins correct. Il n'assume aucune responsabilité pour la fermeture du flux - l'appelant devrait le faire.
Consultez cet article pour plus d'informations (et une implémentation alternative).