5

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

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

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

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

4

1 回答 1

5

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

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

微软程序员不小心交换了低值和高值。好吧,您也可以撤消该错误。自己交换它们,以便错误将它们交换回你想要的方式:

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 回来。

于 2014-02-03T21:30:02.223 回答