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

在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 块结束时,内存映射文件和视图访问器都会被自动关闭和释放。  
    }  
}
相关推荐
2301_7930868721 小时前
Redis 04 Reactor
数据库·redis·缓存
189228048611 天前
NY243NY253美光固态闪存NY257NY260
大数据·网络·人工智能·缓存
青鱼入云1 天前
redis怎么做rehash的
redis·缓存
FFF-X1 天前
Vue3 路由缓存实战:从基础到进阶的完整指南
vue.js·spring boot·缓存
夜影风2 天前
Nginx反向代理与缓存实现
运维·nginx·缓存
编程(变成)小辣鸡2 天前
Redis 知识点与应用场景
数据库·redis·缓存
菜菜子爱学习3 天前
Nginx学习笔记(八)—— Nginx缓存集成
笔记·学习·nginx·缓存·运维开发
魏波.3 天前
常用缓存软件分类及详解
缓存
yh云想3 天前
《多级缓存架构设计与实现全解析》
缓存·junit
白仑色3 天前
Redis 如何保证数据安全?
数据库·redis·缓存·集群·主从复制·哨兵·redis 管理工具