【问题标题】:Read memory mapped file or knowing its size to read it correctely读取内存映射文件或知道其大小以正确读取它
【发布时间】:2024-05-04 05:10:03
【问题描述】:

在这个问题中,

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

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

【问题讨论】:

  • 这个答案有帮助吗? *.com/a/8613300/2258 或者 Jon Skeet 的回答:*.com/a/221941/2258
  • 没用,即使文件为空,它也给了我 4096 个字节:(
  • 在视图的开头也写下流长度。
  • 我在这里没有看到问题。您能否编辑问题,明确您要问的内容?
  • 简单地说,我需要读取内存映射文件而没有关于它的大小的先前信息,如果我在读取任何其他流时尝试读取它,它将具有错误的大小,它的大小将舍入为 X4096 数字(或最接近的系统页面大小)。

标签: c# .net ipc memory-mapped-files


【解决方案1】:

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

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

【讨论】:

    最近更新 更多