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

在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 块结束时,内存映射文件和视图访问器都会被自动关闭和释放。  
    }  
}
相关推荐
weisian1518 小时前
Redis篇--常见问题篇3--缓存击穿(数据查询上锁,异步操作,熔断降级,三种缓存问题综合优化策略)
数据库·redis·缓存
袁震9 小时前
Android-Glide缓存机制
android·缓存·移动开发·glide
HEU_firejef10 小时前
redis——布隆过滤器
数据库·redis·缓存
2401_8711510714 小时前
12月第十九讲:Redis应用Redis相关解决方案
数据库·redis·缓存
Pafey19 小时前
git 删除鉴权缓存及账号信息
git·缓存
weisian15121 小时前
Redis篇--常见问题篇2--缓存雪崩(过期时间分散,缓存预热,多级缓存)
数据库·redis·缓存
苓诣21 小时前
LRU 缓存
缓存·lru
c洛#21 小时前
Linux缓存管理:如何安全地清理系统缓存
linux·运维·缓存
万物得其道者成1 天前
使用 js-cookie 和 localStorage/sessionStorage 构建高效的浏览器缓存管理
开发语言·javascript·缓存
娶个名字趴1 天前
Redis(2)常用命令
java·数据库·redis·缓存