Единственный способ узнать, находится ли Stream
в его конце, - это на самом деле прочитать что-то из него и проверить, равно ли возвращаемое значение 0. (StreamReader
имеет другой способ - проверить свой внутренний буфер, но вы правильно не позволяете это сделать, позвонив DiscardBufferedData
.)
Итак, EndOfStream
должен прочитать хотя бы один байт из основного потока. И поскольку чтение побайтов неэффективно, оно читает больше. Вот почему вызов EndOfStream
меняет позицию в конец (это не конец файла для больших файлов).
Кажется, вам на самом деле не нужно использовать StreamReader
, поэтому вы должны использовать Stream
(или конкретно FileStream
) напрямую:
using (Stream fp = new FileStream(@"d:\RANDOM.txt", FileMode.Open))
{
int n = 0;
while (true)
{
int read = fp.ReadByte();
if (read == -1)
break;
char c = (char)read;
Console.WriteLine("Position of {0} is {1}.", c, fp.Position);
n += 5;
fp.Position = n;
}
}
(Я не уверен, что делает установка положения за концом файла в этой ситуации, вам может потребоваться добавить проверку для этого.)