Невозможно прочитать за пределами потока - PullRequest
6 голосов
/ 19 октября 2011

Я сделал какой-то быстрый способ записать файл из потока, но это еще не сделано.Я получаю это исключение и не могу понять, почему:

Unable to read beyond the end of the stream

Есть ли кто-нибудь, кто мог бы помочь мне отладить его?

public static bool WriteFileFromStream(Stream stream, string toFile)
{
    FileStream fileToSave = new FileStream(toFile, FileMode.Create);
    BinaryWriter binaryWriter = new BinaryWriter(fileToSave);

    using (BinaryReader binaryReader = new BinaryReader(stream))
    {
        int pos = 0;
        int length = (int)stream.Length;

        while (pos < length)
        {
            int readInteger = binaryReader.ReadInt32();

            binaryWriter.Write(readInteger);

            pos += sizeof(int);
        }
    }

    return true;
}

Большое спасибо!

Ответы [ 5 ]

5 голосов
/ 19 октября 2011

Не совсем ответ на ваш вопрос, но этот метод может быть намного проще, как этот:

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 байта).

2 голосов
/ 19 октября 2011

Я предполагаю, что входной поток имеет только целые числа (Int32).Вам нужно проверить метод PeekChar(),

while (binaryReader.PeekChar() != -1)
{
  int readInteger = binaryReader.ReadInt32();
  binaryWriter.Write(readInteger);          
}
1 голос
/ 19 октября 2011

Вы делаете while (pos <длина), а length - это фактическая длина потока в байтах.Таким образом, вы эффективно подсчитываете байты в потоке, а затем пытаетесь прочитать столько разрядов (что неправильно).Вы можете принять длину как stream.Length / 4, поскольку Int32 составляет 4 байта. </p>

0 голосов
/ 20 апреля 2013

После чтения потока двоичным считывателем позиция потока находится в конце, вы должны установить позицию в ноль "stream.position = 0;"

0 голосов
/ 19 октября 2011

1001 * попробовать *

int length = (int)binaryReader.BaseStream.Length;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...