此 C# 代码创建一个 1000 字节的内存映射文件,并在位置 500 处写入 08112003

问题描述 投票:0回答:1
using (MemoryMappedFile mmFile = MemoryMappedFile.CreateNew("Raise", 1000))
{
    using (MemoryMappedViewAccessor accessor = mmFile.CreateViewAccessor())
    {
        accessor.Write(500, 11082003);
        Console.WriteLine("Memory-mapped file created!");
    }
}

using (MemoryMappedFile mmFile = MemoryMappedFile.OpenExisting("Raise"))
{
    using (MemoryMappedViewAccessor accessor = mmFile.CreateViewAccessor())
    {
        int value = accessor.ReadInt32(500);
        Console.WriteLine("The answer is : {0}", value);
    }
}

但是,每次我尝试读取整数值 11082003 时,这就是我得到的结果,System.IO.FileNotFoundException:“无法找到指定的文件。”。可能是什么问题?

c#-4.0 memory-mapped-files
1个回答
0
投票

您正在处理已写入的资源,该资源仅存在于内存中。来自

MemoryMappedFile.CreateNew
的文档:

使用此方法创建一个不持久的内存映射文件(即不与磁盘上的文件关联),您可以使用该文件在进程之间共享数据。

因此,当您处理掉它时,该名称就不再有效。

如果您更改代码以避免在最后处理“创建”部分,那么它会起作用:

using System.IO.MemoryMappedFiles;

using (MemoryMappedFile mmFile1 = MemoryMappedFile.CreateNew("Raise", 1000))
{
    using (MemoryMappedViewAccessor accessor = mmFile1.CreateViewAccessor())
    {
        accessor.Write(500, 11082003);
        Console.WriteLine("Memory-mapped file created!");
    }


    using (MemoryMappedFile mmFile2 = MemoryMappedFile.OpenExisting("Raise"))
    {
        using (MemoryMappedViewAccessor accessor = mmFile2.CreateViewAccessor())
        {
            int value = accessor.ReadInt32(500);
            Console.WriteLine("The answer is : {0}", value);
        }
    }
}

或者,要使用 实际 文件,您可以两次使用

CreateFromFile

using System.IO.MemoryMappedFiles;

using (MemoryMappedFile mmFile = MemoryMappedFile.CreateFromFile("Raise", FileMode.Create, null, 1000))
{
    using (MemoryMappedViewAccessor accessor = mmFile.CreateViewAccessor())
    {
        accessor.Write(500, 11082003);
        Console.WriteLine("Memory-mapped file created!");
    }
}

using (MemoryMappedFile mmFile = MemoryMappedFile.CreateFromFile("Raise"))
{
    using (MemoryMappedViewAccessor accessor = mmFile.CreateViewAccessor())
    {
        int value = accessor.ReadInt32(500);
        Console.WriteLine("The answer is : {0}", value);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.