Stream.Seek поведение - PullRequest
       40

Stream.Seek поведение

1 голос
/ 14 декабря 2011

Я сталкивался с этим ранее сегодня, и я не был уверен, почему это происходит.

У меня есть следующий код, который устанавливает внутреннюю позицию потока файла в местоположение, чтобы я мог прочитать количество строк из этой позиции.Это похоже на этот другой пост , но когда я использовал stream.Seek, я вижу странные результаты

StringBuilder b = new StringBuilder();
using(var stream = _streamFactory.CreateStream())
using (var streamReader = new System.IO.StreamReader(stream, _streamFactory.Encoding))
{
     stream.Seek(startPosition, System.IO.SeekOrigin.Begin);

     string value;
     for (int i = 0; i < lines; i++)
     {
         if ((value = streamReader.ReadLine()) != null)
         {
             b.AppendLine(value);
         }
      }
 }

Теперь я читаю файл с использованием кодировки UTF-8, поэтому яЯ знаю, что в начале файла есть дополнительные биты, которые обозначают это, но не являются частью текста, который я хочу извлечь.

Скажите для примера У меня есть следующий текст в файле

Hello my name is bob

Так что, если я установлю startPosition в 0, мои результаты будут Здравствуйте, меня зовут Боб однако, когда я устанавливаю startPosition в 1, я не получаю ello, меня зовут bob , а скорее @@ Здравствуйте, меня зовут bob , где @@ - 2 байта от битов кодирования.

Итак, мой вопрос: почему, когда я устанавливаю .Seek(0), а затем делаю ReadLine, я получаю правильную строку, но Seek(1) вернет 2-й и 3-й байты кодировки?

Seek(3) также даст те же результаты, что и Seek(0).Если бы это было согласованно, я бы подумал, что Seek(0) вернет @@@ Привет, меня зовут Боб

Также, как узнать, сколько дополнительных байтов в начале файла безчитая его (но зная кодировку)?

Я пытался посмотреть на разобранный код и должен был остановиться, прежде чем мой мозг начал бастовать.

Примечание: Streambuilder вэтот случай просто создает FileStream.Я делаю это, так что я могу модульное тестирование этого кода, используя MemoryStream

1 Ответ

1 голос
/ 14 декабря 2011

Первые два байта представляют кодировку файла.Взгляните на эту статью.

...