有没有人知道一个复合流解决方案,它会将Stream的第一部分预先加载到MemoryStream中,并将剩余部分保留为原始Stream,当需要后续部分时将会访问它?
我应该想象一些包装类会实现Stream接口,并根据访问的部分透明地处理两个流之间的访问。
我希望这是以前有人可能解决过的解决方案,也许是为了优化读取大型FileStream的性能。
在我的情况下,我试图解决从SD卡读取大文件的Windows Phone 8错误。在这个答案中提供了我试图环绕的问题的更多细节: https://stackoverflow.com/a/17355068/250254
答案 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回。