0

我最近遇到的一个有趣的问题:

我实现了一个Stream类(自定义流管道组件的包装流),后来的一些测试让我的管道抛出了异常。异常是从对 Seek 的调用中引发的,由于我的流是仅向前的、不可写的流实现(CanSeek 和 CanWrite 返回 false,Position:set 引发异常,没有什么异常),因此我已对其进行硬编码以引发NotImplementedException 。对 Seek 的调用来自非托管代码,因此我无法真正对其进行过多调试。我真正能说的是,在我的Stream实现中调用了 Seek,即使我的 CanSeek 返回 false 并且用户甚至没有检查 CanSeek。

那是怎么回事?

4

1 回答 1

7

所有答案都在这里找到:在托管流管道组件中实现搜索方法

事实证明,在没有 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()");
   }
}

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

于 2012-06-16T03:31:51.097 回答