创建和读写内存映射文件,用于同电脑上不同软件之间进行数据交互

在C#中,MemoryMappedFile 类允许你创建或打开一个内存映射文件,而 ViewAccessor 类则提供了一种方法来访问该文件的特定部分。以下是一个完整的示例,展示了如何创建或打开一个内存映射文件,如何使用 ViewAccessor 进行读写操作,以及如何查询数据。

示例代码:

csharp 复制代码
using System;  
using System.IO.MemoryMappedFiles;  
using System.Runtime.InteropServices;  
  
class Program  
{  
    // 内存映射文件的名称  
    private const string mapName = "exampleMap";  
    // 内存映射文件的大小(以字节为单位)  
    private const int mapSize = 1024;  
    // 要写入的数据的起始地址(偏移量)  
    private const int startOffset = 0;  
  
    static void Main()  
    {  
        // 创建或打开内存映射文件  
        using (var mmf = MemoryMappedFile.CreateOrOpen(mapName, mapSize))  
        {  
            // 创建一个视图访问器,用于读写操作  
            using (var accessor = mmf.CreateViewAccessor(startOffset, mapSize))  
            {  
                // 写入数据(整数)  
                int dataToWrite = 42;  
                accessor.Write(0, dataToWrite);  
  
                // 读取数据(整数)  
                int dataRead = accessor.ReadInt32(0);  
                Console.WriteLine($"Read data: {dataRead}");  
  
                // 写入数据(布尔值,注意布尔值通常占用1位,但这里为了简单起见,我们写入一个字节)  
                bool boolValueToWrite = true;  
                byte boolByte = boolValueToWrite ? (byte)1 : (byte)0;  
                accessor.Write(4, boolByte);  
  
                // 读取数据(布尔值)  
                byte boolByteRead = accessor.ReadByte(4);  
                bool boolValueRead = boolByteRead == 1;  
                Console.WriteLine($"Read bool data: {boolValueRead}");  
  
                // 写入数据(字符串,注意字符串需要序列化为字节数组)  
                string strToWrite = "Hello";  
                byte[] strBytes = System.Text.Encoding.UTF8.GetBytes(strToWrite);  
                accessor.WriteArray(8, strBytes, 0, strBytes.Length);  
  
                // 读取数据(字符串)  
                byte[] strBytesRead = new byte[strBytes.Length];  
                accessor.ReadArray(8, strBytesRead, 0, strBytesRead.Length);  
                string strRead = System.Text.Encoding.UTF8.GetString(strBytesRead);  
                Console.WriteLine($"Read string data: {strRead}");  
            }  
        }  
  
        // 注意:当 using 块结束时,内存映射文件和视图访问器都会被自动关闭和释放。  
    }  
}
相关推荐
qq_281684211 小时前
Apt-Serve:基于混合缓存与自适应调度突破LLM推理KV缓存瓶颈,吞吐量提升8.8倍
缓存
1104.北光c°3 小时前
深入浅出 Elasticsearch:从搜索框到精准排序的架构实战
java·开发语言·elasticsearch·缓存·架构·全文检索·es
FakeOccupational3 小时前
【电路笔记 STM32】Cortex-M7 内核上的数据缓存结构图 + MPU内存保护单元 + Cache基本操作 + Cache&DMA 时序图
笔记·stm32·缓存
AMoon丶3 小时前
Golang--内存管理
开发语言·后端·算法·缓存·golang·os
小江的记录本5 小时前
【Redis】Redis常用命令速查表(完整版)
java·前端·数据库·redis·后端·spring·缓存
ZHOUPUYU6 小时前
从缓存到消息队列的全面应用,PHP与Redis深度实战
redis·缓存·php
我真会写代码21 小时前
从入门到精通:Kafka核心原理与实战避坑指南
分布式·缓存·kafka
我真会写代码1 天前
Redis高频面试题(含标准答案,覆盖基础+进阶+实战)
数据库·redis·缓存
6+h1 天前
【Redis】缓存问题及解决方案
数据库·redis·缓存
6+h1 天前
【Redis】高可用核心讲解
数据库·redis·缓存