如何检测MemoryMappedFile是否正在使用

本文关键字:是否 MemoryMappedFile 何检测 检测 | 更新日期: 2023-09-27 18:25:48

在C#4.0中,MemoryMappedFile有几个工厂方法:CreateFromFileCreateNewCreateOrOpenOpenExisting。如果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上抛出异常。在我尝试调用OpenExisting之前,有没有办法检查MemoryMappedFile是否真的存在?还是每次都要处理例外情况?

此外,是否有一种方法可以查明当前句柄是否是最后一个打开MemoryMappedFile的句柄,以确定在处理当前句柄时是否会关闭文件?

如何检测MemoryMappedFile是否正在使用

您可以使用MemoryMappedFile.CreateOrOpen:

map = MemoryMappedFile.CreateOrOpen(
                MapName, length + 16,
                MemoryMappedFileAccess.ReadWrite, 
                MemoryMappedFileOptions.None, null, HandleInheritability.None);

接受答案请参阅韩在原问题下的评论。既然我不能将其标记为已接受,我就在这里引用它,并将其标记为此已接受。