C # - Stream / FileStream EOF - PullRequest
       22

C # - Stream / FileStream EOF

7 голосов
/ 16 февраля 2011

Кто-нибудь знает способ узнать, что вы в конце файла? Я использую BinaryReader и пробовал PeekChar - но он выдает исключение. Любые другие предложения?

Спасибо.

Ответы [ 5 ]

11 голосов
/ 16 февраля 2011

Из Stream, если вы Read(buffer, offset, count), вы получите неположительный результат, а если вы Peek(), вы получите отрицательный результат.

С BinaryReader, документация предполагает, что PeekChar() должен возвращать отрицательное значение:

Возвращаемое значение

Тип: System.Int32 Следующий доступный символ или -1, если не болеесимволы доступны или поток не поддерживает поиск.

Вы уверены, что это не поток поврежденный ?т.е. оставшиеся данные не могут сформировать полное char из заданной кодировки?

1 голос
/ 10 августа 2017

Проверка, находится ли положение считывателя меньше его длины, делает хитрость

While BinReader.Position < BinReader.Length
{
 ... BinReader.Read() ...
}
1 голос
/ 16 февраля 2011

Если ваш поток поддерживает поиск (проверьте это с помощью свойства BaseStream.CanSeek), проверьте свойство Position BaseStream, например, так:

if (myBinaryReader.BaseStream.CanSeek){
   bool atEnd = (myBinaryReader.BaseStream.Position == myBinaryReader.BaseStream.Length - 1)
}
0 голосов
/ 04 апреля 2017

Я добавлю свое предложение: если вам не нужна часть кодирования BinaryReader (поэтому вы не используете различные ReadChar / ReadChars / ReadString), тогда вы можетеиспользуйте кодировщик, который никогда не сгенерирует, и который всегда будет один байт на символ.Encoding.GetEncoding("iso-8859-1") идеально подходит для этого.Кодировка iso-8859-1 представляет собой кодировку в один байт на символ, которая отображает 1: 1 всех первых 256 символов Unicode (поэтому byte 254 - это, например, char 254)

0 голосов
/ 16 февраля 2011
While BinReader.PeekChar() > 0
{
...
}
...