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

本文关键字:调用 Seek false CanSeek 返回 为什么 | 更新日期: 2023-09-27 18:37:19

我最近遇到的有趣问题:

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

这是怎么回事?

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

所有答案都在这里找到: 在托管流式处理管道组件中实现查找方法

事实证明,当年没有

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()");
   }
}

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