如何检测MemoryMappedFile是否正在使用中

时间:2012-02-23 22:03:31

标签: c# memory-mapped-files

在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方式上抛出异常。在尝试进行MemoryMappedFile调用之前,有没有办法检查OpenExisting是否确实存在?或者我每次都必须处理异常?

另外,有没有办法找出当前句柄是否是打开MemoryMappedFile的最后句柄,以确定当前句柄被处理时文件是否会被关闭?

2 个答案:

答案 0 :(得分:0)

您可以使用MemoryMappedFile.CreateOrOpen

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

答案 1 :(得分:0)

请参阅Han Passant在原始问题下对已接受答案的评论。由于我无法将其标记为已接受,因此我将在此处引用并将其标记为已接受。