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

标签 c# stream wrapper memorystream stream-wrapper

有谁知道一种复合流解决方案,可以将流的第一部分预加载到 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/

相关文章:

C# WCF 存储库

c# - 帮助将 sql 查询转换为 LINQ

c - 从 stdin 读取数据而不阻塞的可移植方法

python - 使用 functools.wraps 装饰器尝试类的每个函数

c# - 如何验证我的数据表是否为空

c# - 比较字段(验证 c#/asp.net)

flutter - Flutter BLoC(flutter_bloc)是否与onDispose等效?

javascript - 如何在 node.js 中读取整个文本流?

php - 有人使用过这个 Highrise API PHP Wrapper 库吗?我需要帮助验证

c - 用 Objective-C 包装一个 C 库 - 函数指针