Composite Stream Wrapper提供部分MemoryStream和完整的原始Stream

有没有人知道一个复合流解决方案,它会将Stream的第一部分预加载到MemoryStream中,并将剩余部分保留为原始Stream,当需要后续部分时将访问它们?

我应该想象一些包装器类将实现Stream接口并透明地处理两个流之间的访问,具体取决于访问哪个部分。

我希望这是以前有人可能解决过的解决方案,也许是为了优化读取大型FileStream的性能。

在我的情况下,我试图解决从SD卡读取大文件的Windows Phone 8错误。 此答案中提供了我试图环绕的问题的更多详细信息: https : //stackoverflow.com/a/17355068/250254

没有任何合理的方法可以使用MemoryStream来解决这个bug,你首先会遇到OutOfMemoryException。 让我们稍微关注一下这个bug,我会简化代码以使其可读:

DistanceToMove = (offset & 0xffffffff00000000L) >> 32; DistanceToMoveHigh = offset & 0xffffffffL; SetFilePointer(this.m_handle, lDistanceToMove, ref lDistanceToMoveHigh, begin); 

微软程序员意外地交换了低值和高值。 好吧,你也可以撤消这个bug。 自己交换它们,以便bug以你想要的方式将它们交换回来:

 public static void SeekBugWorkaround(Stream stream, long offset, SeekOrigin origin) { ulong uoffset = (ulong)offset; ulong fix = ((uoffset & 0xffffffffL) << 32) | ((uoffset & 0xffffffff00000000L) >> 32); stream.Seek((long)fix, origin); } 

如果需要说,显然,你必须指望微软最终修复这个bug。 很难预测何时如此赌博下一点发布。 有一些可以自动检测到这种情况的可能性,尽管微软将要做的事情并不明显,因为这个错误是如此突破。 Seek()的返回值以及Position属性返回值都会遇到同样的错误。 所以寻找位置1并确认你得到1回。