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

时间:2013-12-30 09:21:28

标签: c# stream wrapper memorystream stream-wrapper

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

我应该想象一些包装类会实现Stream接口,并根据访问的部分透明地处理两个流之间的访问。

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

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

1 个答案:

答案 0 :(得分:5)

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

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

Microsoft程序员意外地交换了低值和高值。好吧,你也可以撤消这个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);
}

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