Не совсем ответ на ваш вопрос, но этот метод может быть намного проще, как этот:
public static void WriteFileFromStream(Stream stream, string toFile)
{
// dont forget the using for releasing the file handle after the copy
using (FileStream fileToSave = new FileStream(toFile, FileMode.Create))
{
stream.CopyTo(fileToSave);
}
}
Обратите внимание, что я также удалил возвращаемое значение, так как оно довольно бесполезно, так как в вашем коде естьтолько 1 оператор возврата
Кроме того, вы выполняете проверку длины потока, но многие потоки не поддерживают проверку длины.
Что касается вашей проблемы, вы сначала проверяете, находится ли поток на его уровне.конец.Если нет, вы читаете 4 байта.Здесь проблема.Допустим, у вас есть входной поток 6 байтов.Сначала вы проверяете, заканчивается ли поток.Ответ - нет, поскольку осталось 6 байтов.Вы читаете 4 байта и проверяете снова.Конечно, ответ все еще нет, так как осталось 2 байта.Теперь вы читаете еще 4 байта, но это, конечно, не получается, поскольку есть только 2 байта.(readInt32 читает следующие 4 байта).