为什么在从CanSeek返回false的流上调用Seek?

时间:2012-06-16 03:27:00

标签: c# stream biztalk

我最近碰到的有趣问题:

我实现了一个Stream类(一个自定义流管道组件的包装流),后来的一些测试让我的管道抛出异常。由于我的流是一个仅向前的,不可写的流实现(CanSeek和CanWrite返回false,位置:设置抛出异常,因此我已经硬编码抛出一个NotImplementedException,因此抛出了异常。没什么不寻常的。对Seek的调用来自非托管代码,因此我无法真正调试它。我真正可以告诉的是,即使我让CanSeek返回false并且用户甚至没有检查CanSeek,我的Stream实现也会调用Seek。

这是怎么回事?

1 个答案:

答案 0 :(得分:7)

所有答案均可在此处找到:Implementing a Seek Method in a Managed Streaming Pipeline Component

事实证明,当时没有位置属性。因此,获取流指针当前位置的方法是调用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()");
   }
}

这就是整个解决方案。耶!