1.System.IO.MemoryMappedFiles 內存映射文件類
內存映射文件將文件的內容映射到應用程序的邏輯地址空間。 內存映射文件使程序員得以處理極大的文件(這是因為可以並發管理內存),並且它們允許對文件進行完整的隨機訪問而不需要查找文件。 內存映射文件還可以在多個進程之間進行共享。
CreateFromFile 方法基於磁盤上的現有文件的指定路徑或 FileStream 創建一個內存映射文件。 未映射映射文件時,更改都將自動傳播到磁盤。
CreateNew 方法創建一個未映射到磁盤上的現有文件的內存映射文件;而且這些方法還適合創建用於進程間通信 (IPC) 的共享內存。
內存映射文件與名稱相關聯。
您可以創建內存映射文件的多個視圖,包括部分文件的視圖。 可以將某個文件的相同部分映射到多個地址,以創建並發內存。 為了使兩個視圖能夠並發,必須基於同一內存映射文件創建這兩個視圖。 對同一文件創建兩個文件映射的兩個視圖不具有並發性。(https://msdn.microsoft.com/zh-cn/library/system.io.memorymappedfiles.memorymappedfile(v=vs.100).aspx)
常用函數:
[SecurityPermissionAttribute(SecurityAction.Demand, Flags = SecurityPermissionFlag.UnmanagedCode)] public static MemoryMappedFile CreateOrOpen( string mapName, //要分配給內存映射文件的名稱。 long capacity,//要分配給內存映射文件的最大大小(以字節為單位)。 MemoryMappedFileAccess access,//用於指定內存映射文件允許的訪問類型的枚舉值之一。 默認值為 ReadWrite。 MemoryMappedFileOptions options,//枚舉值的按位組合,用於為內存映射文件指定內存分配選項。 MemoryMappedFileSecurity memoryMappedFileSecurity,//可以針對內存映射文件授予的文件訪問和操作權限。此參數可以為 null。 HandleInheritability inheritability//用於指定內存映射文件的句柄能否由子進程繼承的枚舉值之一。 默認值為 None。 )
在系統內存中創建或打開一個具有指定容量、訪問類型、內存分配、安全權限和繼承性的內存映射文件。
使用此方法創建或打開一個不持久保留的內存映射文件(即,不與磁盤上的文件關聯),您可以使用該文件在進程之間共享數據。
using (var mmf = MemoryMappedFile.CreateOrOpen("testMmf", capacity, MemoryMappedFileAccess.ReadWrite))
{
//通過MemoryMappedFile的CreateViewAccssor方法獲得共享內存的訪問器
var viewAccessor = mmf.CreateViewAccessor(0, capacity);
viewAccessor.Write(0, input.Length);
//向共享內存4位置寫入字符
viewAccessor.WriteArray<char>(4, input.ToArray(), 0, input.Length);
}
public static MemoryMappedFile CreateNew( string mapName, //要分配給內存映射文件的名稱。 long capacity //要分配給內存映射文件的最大大小(以字節為單位)。 )
使用此方法創建一個不持久保留的內存映射文件(即,不與磁盤上的文件關聯),您可以使用該文件在進程之間共享數據。
static void Main(string[] args)
{
using (MemoryMappedFile mmf = MemoryMappedFile.CreateNew("testmap", 10000))
{
bool mutexCreated;
Mutex mutex = new Mutex(true, "testmapmutex", out mutexCreated);
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryWriter writer = new BinaryWriter(stream); writer.Write(1);
}
mutex.ReleaseMutex();
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream())
{
BinaryReader reader = new BinaryReader(stream);
Console.WriteLine("Process A says: {0}", reader.ReadBoolean());
Console.WriteLine("Process B says: {0}", reader.ReadBoolean());
Console.WriteLine("Process C says: {0}", reader.ReadBoolean());
}
mutex.ReleaseMutex();
}
}
