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

在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 块结束时,内存映射文件和视图访问器都会被自动关闭和释放。  
    }  
}
相关推荐
不惑_5 小时前
Redis与MySQL双写一致性的缓存模式
redis·mysql·缓存
是丝豆呀6 小时前
清理pip和conda缓存
缓存·conda·pip
北笙··15 小时前
Redis慢查询分析优化
数据库·redis·缓存
p-knowledge15 小时前
redis的三种客户端
数据库·redis·缓存
积水成江15 小时前
Redis相关面试题
数据库·redis·缓存
瓜牛_gn17 小时前
redis详细教程(4.GEO,bitfield,Stream)
数据库·redis·缓存
瓜牛_gn20 小时前
redis详细教程(5.AOP和RDB持久化)
数据库·redis·缓存
一心赚狗粮的宇叔20 小时前
java web调试时清理当前网址的缓存
java·前端·笔记·后端·缓存
FIN技术铺1 天前
问:缓存穿透、雪崩、预热、击穿、降级,怎么办?
数据库·spring·缓存
IsToRestart1 天前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存