在 C# 4.0 中,
MemoryMappedFile
有多种工厂方法:CreateFromFile
、CreateNew
、CreateOrOpen
或 OpenExisting
。我需要打开 MemoryMappedFile
(如果存在),如果不存在,则从文件创建它。 我打开内存映射的代码如下所示:
try
{
map = MemoryMappedFile.OpenExisting(
MapName,
MemoryMappedFileRights.ReadWrite
| MemoryMappedFileRights.Delete);
}
catch (FileNotFoundException)
{
try
{
stream = new FileStream(
FileName,
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.Read | FileShare.Delete);
map = MemoryMappedFile.CreateFromFile(
stream, MapName, length + 16,
MemoryMappedFileAccess.ReadWrite,
null,
HandleInheritability.None,
false);
}
catch
{
if (stream != null)
stream.Dispose();
stream = null;
}
}
它几乎按照我想要的方式工作,但它最终会频繁地在
OpenExisting
上抛出异常。 在我尝试进行 MemoryMappedFile
调用之前,有没有办法检查 OpenExisting
是否确实存在? 还是我每次都必须处理异常?
还有,有没有办法找出当前句柄是否是最后一个打开
MemoryMappedFile
的句柄,以确定当前句柄被处理后是否会关闭文件?
您可以使用MemoryMappedFile.CreateOrOpen:
map = MemoryMappedFile.CreateOrOpen(
MapName, length + 16,
MemoryMappedFileAccess.ReadWrite,
MemoryMappedFileOptions.None, null, HandleInheritability.None);
Hans Passant在评论中给出了对我有用的答案:
这不是一个真正的问题,您需要执行步骤 #2 以使 MMF 真正可用。这需要至少一个命名互斥体来控制哪些进程可以写入映射内存。这些流程之一必须是老板,如果你愿意的话,也可以是仲裁者。需要先启动。