<p>Cela dépend vraiment de si vous pouvez faire confiance à <code>s.Length</code> ou non. Pour de nombreux flux, vous ne savez tout simplement pas quelle quantité de données il y aura. Dans de tels cas - et avant .NET 4 - j’utiliserais du code comme celui-ci :</p>
<pre><code class="lang-auto">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();
}
}
</code></pre>
<p>Avec .NET 4 et supérieur, j’utiliserais <a href="https://msdn.microsoft.com/en-us/library/system.io.stream.copyto"><code>Stream.CopyTo</code></a>, qui est essentiellement équivalent à la boucle dans mon code - créez le <code>MemoryStream</code>, appelez <code>stream.CopyTo(ms)</code> puis retournez <code>ms.ToArray()</code>. Et voilà.</p>
<p>Je devrais peut-être expliquer pourquoi ma réponse est plus longue que les autres. <a href="http://msdn.microsoft.com/en-us/library/system.io.stream.read.aspx"><code>Stream.Read</code></a> ne garantit pas qu’il lira tout ce qui lui est demandé. Si vous lisez depuis un flux réseau, par exemple, il pourrait lire la valeur d’un paquet et retourner, même s’il y aura plus de données bientôt. <a href="http://msdn.microsoft.com/en-us/library/system.io.binaryreader.read.aspx"><code>BinaryReader.Read</code></a> continuera jusqu’à la fin du flux ou jusqu’à votre taille spécifiée, mais vous devez tout de même connaître la taille au départ.</p>
<p>La méthode ci-dessus continuera à lire (et copier dans un <code>MemoryStream</code>) jusqu’à épuisement des données. Elle demande ensuite au <code>MemoryStream</code> de retourner une copie des données dans un tableau. Si vous connaissez la taille au départ - ou <em>pensez</em> connaître la taille, sans en être sûr - vous pouvez construire le <code>MemoryStream</code> avec cette taille au départ. De même, vous pouvez ajouter une vérification à la fin, et si la longueur du flux est la même taille que le tampon (retourné par <a href="http://msdn.microsoft.com/en-us/library/system.io.memorystream.getbuffer.aspx"><code>MemoryStream.GetBuffer</code></a>), vous pouvez simplement retourner le tampon. Donc le code ci-dessus n’est pas tout à fait optimisé, mais sera au mo</p>
<p><em>(Réponse tronquée)</em></p>