Вместо того, чтобы пытаться получить длину, вы должны читать из потока, пока он не вернет, что он «готов».В .NET 4 это действительно просто:
// Assuming we *really* want to read it into memory first...
MemoryStream memoryStream = new MemoryStream();
stream.CopyTo(memoryStream);
memoryStream.Position = 0;
File.WriteAllBytes(filepath, memoryStream);
В .NET 3.5 нет метода CopyTo
, но вы можете написать что-то похожее самостоятельно:
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8192];
int bytesRead;
while ((bytesRead = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, bytesRead);
}
}
Однако сейчасу нас есть что скопировать поток, зачем сначала читать все это в памяти?Давайте просто напишем это прямо в файл:
using (FileStream output = File.OpenWrite(filepath))
{
CopyStream(stream, output); // Or stream.CopyTo(output);
}