没有任何合理的方法可以使用 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 回来。