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?
No recibo su pregunta. ¿A qué te refieres con "pero termina arrojando una excepción en OpenExisting demasiado a menudo"? – Krizz
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. –
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. –