读取内存映射文件或知道其大小以正确读取它

在这个问题上,

读取内存映射文件或内存映射视图访问器的所有内容,而不知道它的大小

有一个问题, (int)stream.Length没有给我正确的长度,而是给出了使用的内部缓冲区的大小! 我需要刷新这个问题,因为它非常紧迫。

主要问题是:

我需要类似于ReadToEnd或ReadAllBytes的东西来使用MappedViewAccessor读取MemoryMappedFile的所有内容,如果我不知道它的大小,我该怎么办呢?

我已经搜索过了,我已经看到了这个问题,但这不是我要找的东西:

如何从.NET中的内存映射文件中快速读取字节?

旧答案是:

酒馆

 public static ReadMMFAllBytes(string fileName) { using (var mmf = MemoryMappedFile.OpenExisting(fileName)) { using (var stream = mmf.CreateViewStream()) { using (BinaryReader binReader = new BinaryReader(stream)) { return binReader.ReadBytes((int)stream.Length)); } } } } 

在这个问题中:

内存映射文件长度

确切的问题没有确切的答案! 问题是关于标题之外的其他问题。

最好的方法是首先发送一个固定长度的排序头,而不是仅仅传输原始字节。 这样,您读取的第一个blob是一致的长度,它为您提供了读取可变长度余数所需的信息。

在最简单的情况下,您的记录可以像首先写入长度字段一样简单,然后是有效负载(您的字节)。 根据您的需要,您可以将数据添加到标题中,如记录类型,版本等。