有谁知道一种复合流解决方案,可以将流的第一部分预加载到 MemoryStream 中,并将其余部分保留为原始流,以便在需要后续部分时访问这些流?
我应该想象一些包装类会实现 Stream 接口(interface),并根据访问的部分透明地处理两个流之间的访问。
我希望这是以前有人解决过的解决方案,也许可以优化读取大型 FileStream 的性能。
在我的例子中,我试图绕过 Windows Phone 8 从 SD 卡读取大文件的错误。此答案中提供了我试图绕过的问题的更多详细信息: https://stackoverflow.com/a/17355068/250254
最佳答案
没有任何合理的方法可以使用 MemoryStream 来解决该错误,您将首先遇到 OutOfMemoryException。让我们稍微关注一下错误,我将稍微简化代码以使其可读:
DistanceToMove = (offset & 0xffffffff00000000L) >> 32;
DistanceToMoveHigh = offset & 0xffffffffL;
SetFilePointer(this.m_handle, lDistanceToMove, ref lDistanceToMoveHigh, begin);
Microsoft 程序员不小心调换了低值和高值。好吧,你也可以撤消错误。自己交换它们,以便 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 回来。
关于c# - Composite Stream Wrapper 提供部分 MemoryStream 和完整的原始 Stream,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20836625/