在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的句柄,以确定在释放当前句柄时是否将关闭文件?

最佳答案

您可以使用MemoryMappedFile.CreateOrOpen

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

09-25 17:37