Как определить, используется ли MemoryMappedFile - PullRequest
5 голосов
/ 24 февраля 2012

В 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, чтобы определить, будет ли файлбыть закрытым, когда текущий дескриптор расположен?

Ответы [ 2 ]

0 голосов
/ 28 марта 2012

См. Комментарий Хана Пассанта под оригинальным вопросом о принятом ответе.Поскольку я не могу пометить его как принятый, я просто ссылаюсь на него здесь и отмечаю как принятый.

0 голосов
/ 24 февраля 2012

Вы можете использовать MemoryMappedFile.CreateOrOpen :

map = MemoryMappedFile.CreateOrOpen(
                MapName, length + 16,
                MemoryMappedFileAccess.ReadWrite, 
                MemoryMappedFileOptions.None, null, HandleInheritability.None);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...