Gerçekten güvenip güvenemeyeceğinize bağlıdır s.Length
. Birçok akış için, ne kadar veri olacağını bilmiyorsunuz. Bu gibi durumlarda - ve .NET 4'ten önce - böyle bir kod kullanırdım:
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();
}
}
.NET 4 ve üstü ile, Stream.CopyTo
temelde benim kod döngü - eşdeğer kullanın, oluşturmak MemoryStream
, çağrı stream.CopyTo(ms)
ve sonra dön ms.ToArray()
. İş bitmiş.
Belki de cevabımın neden diğerlerinden daha uzun olduğunu açıklamalıyım. Stream.Read
istenen her şeyi okuyacağını garanti etmez. Örneğin, bir ağ akışından okuyorsanız, bir paketin değerini okuyabilir ve yakında daha fazla veri olsa bile geri dönebilir. BinaryReader.Read
akışın sonuna veya belirttiğiniz boyuta kadar devam eder, ancak yine de başlamak için boyutu bilmeniz gerekir.
Yukarıdaki yöntem MemoryStream
, veri bitene kadar okumaya devam eder (ve a'ya kopyalar ). Daha sonra MemoryStream
, bir dizideki verilerin bir kopyasını döndürmesini ister . Başlamak için boyutu biliyorsanız - veya boyutu bilmediğinizi düşünüyorsanız , emin olmadan - MemoryStream
ile başlamak için bu boyutta olacak şekilde yapılandırabilirsiniz . Benzer şekilde, sonunda bir kontrol koyabilirsiniz ve akışın uzunluğu arabellekle (döndürülen MemoryStream.GetBuffer
) ile aynı boyuttaysa, ara belleği geri verebilirsiniz. Dolayısıyla yukarıdaki kod oldukça optimize edilmemiştir, ancak en azından doğru olacaktır. Akışı kapatmak için herhangi bir sorumluluk kabul etmez - arayan bunu yapmalıdır.
Daha fazla bilgi (ve alternatif bir uygulama) için bu makaleye bakın .