2012-02-23 21 views
5

En C# 4.0, MemoryMappedFile tiene varios métodos de fábrica: CreateFromFile, CreateNew, CreateOrOpen, o OpenExisting. Necesito abrir el MemoryMappedFile si existe, y si no, crearlo desde un archivo. Mi código para abrir el mapa de memoria se parece a esto:Cómo detectar si un archivo proyectado en memoria está en uso

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; 
    } 
} 

Es más o menos funciona de la manera que yo quiero que, pero termina lanzar una excepción en OpenExisting demasiado a menudo. ¿Hay alguna manera de comprobar si el MemoryMappedFile existe realmente antes de intentar hacer la llamada OpenExisting? ¿O tengo que lidiar con la excepción cada vez?

Además, ¿hay alguna manera de averiguar si el identificador actual es el último que tiene el MemoryMappedFile abierto, para determinar si el archivo se cerrará cuando se elimine el identificador actual?

+0

No recibo su pregunta. ¿A qué te refieres con "pero termina arrojando una excepción en OpenExisting demasiado a menudo"? – Krizz

+1

Si pruebo CreateFromFile primero, arroja una excepción si ya está abierta, si pruebo OpenExisting primero, arroja una excepción si no está abierto. Quiero evitar por completo esas excepciones si es posible comprobando si existe. Solo quiero lidiar con excepciones en circunstancias verdaderamente excepcionales, no cada vez que llega a esa línea de código. –

+1

Esto no es un problema real, debe trabajar en el paso 2 para que el archivo MMF sea realmente utilizable. Eso requiere al menos un mutex con nombre para controlar qué proceso puede escribir en la memoria mapeada. Uno de esos procesos tiene que ser el jefe, el árbitro, si se quiere. Necesita comenzar primero. –

Respuesta

0

Ver Han de Passant bajo la pregunta original de respuesta aceptada. Como no puedo marcarlo como aceptado, solo lo mencionaré aquí y lo marcaré como aceptado.

0

Puede utilizar MemoryMappedFile.CreateOrOpen: comentario

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

El problema es que solo crea un mapa de solo memoria, no permite la asignación a un archivo del sistema de archivos. ¿Hay alguna forma de conectarlo a un archivo después de que se haya abierto? –

Cuestiones relacionadas