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

Gav*_*vin 5 c# memorystream stream wrapper stream-wrapper

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

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

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

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

Han*_*ant 5

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

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

微软程序员意外地交换了低值和高值.好吧,你也可以撤消这个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);
}
Run Code Online (Sandbox Code Playgroud)

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