2013-03-05 55 views
1

在这个问题上,读取内存映射文件或者知道它的大小correctely阅读

Read all contents of memory mapped file or Memory Mapped View Accessor without knowing the size of it

有一个问题,(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)); 
      } 
     } 
    } 
} 

在这个问题上:

Memory Mapped File Length

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

+0

此答案帮助吗? http://stackoverflow.com/a/8613300/2258或Jon Skeet的回答:http://stackoverflow.com/a/221941/2258 – 2013-03-05 16:46:39

+0

没有工作,它给我4096字节,即使文件是空的:( – 2013-03-05 17:00:12

+0

只需在视图的开头写入流长度 – 2013-03-05 19:16:56

回答

1

最好的方法是首先发送一个固定长度的排序头,而不是只传送原始字节。这样你读的第一个blob是一致的长度,它给你你需要读取可变长度余数的信息。

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