2013-03-05 62 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是一致的長度,它給你你需要讀取可變長度餘數的信息。

在最簡單的情況下,您的記錄可以像首先寫入長度字段,然後是有效負載(您的字節)一樣簡單。根據您的需要,您可以將數據添加到標題中,如記錄類型,版本等。