Почему Seek вызывается для потока, который возвращает false из CanSeek?

Интересная проблема, с которой я столкнулся недавно:

Я реализовал класс Stream (поток-оболочка для пользовательский компонент конвейера потоковой передачи), а в некоторых более поздних тестах мой конвейер выдавал исключение. Исключение было вызвано вызовом Seek, для которого я жестко закодировал исключение NotImplementedException. из-за того, что мой поток является прямой и недоступной для записи реализацией потока (CanSeek и CanWrite возвращают false, Position:set генерирует исключение, ничего необычного). Вызов Seek исходил из неуправляемого кода, поэтому я не мог слишком много его отлаживать. Все, что я действительно мог сказать, это то, что Seek вызывался в моем Stream, несмотря на то, что CanSeek возвращал false, а пользователь даже не проверял CanSeek.

Что случилось с этим?


person Task    schedule 16.06.2012    source источник


Ответы (1)


Все ответы были найдены здесь: Реализация метода поиска в управляемом потоковом конвейере. Компонент

Оказывается, так было раньше, когда не было свойства Position. Таким образом, способ получить текущую позицию указателя потока состоял в том, чтобы вызвать Seek( 0, SeekOrigin.Current );

Очаровательный. Снова старая новинка.

Эта страница дала требуемую реализацию Seek:

override public long Seek(long offset, SeekOrigin origin)
{
   long pos = -1;

   switch(origin)
   {
      case SeekOrigin.Begin :
         pos = offset;
         break;
      case SeekOrigin.Current :
         pos = Position + offset;
         break;
      case SeekOrigin.End :
         break;
   }

   // We generally disallow seeking of the stream
   // However, in unmanaged code, many people use Seek(0,CURR) to retrieve    // the current position
   // Special case (that is, if Seek does not change position, do not 
   // throw an exception)
   if (pos==Position)
   {
      return pos;
   }
   else
   {
      throw new NotSupportedException("ForwardOnlyEventingReadStream does not support Seek()");
   }
}

И это было все решение. Ура!

person Task    schedule 16.06.2012