在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 块结束时,内存映射文件和视图访问器都会被自动关闭和释放。
}
}