2012-02-23 8 views
5

In C# 4.0, MemoryMappedFile ha diversi metodi di fabbrica: CreateFromFile, CreateNew, CreateOrOpen o OpenExisting. Devo aprire MemoryMappedFile se esiste, e in caso contrario, crearlo da un file. Il mio codice per aprire la mappa della memoria si presenta così:Come rilevare se un file mappato in memoria è in 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; 
    } 
} 

E 'più o meno funziona il modo in cui voglio che, ma finisce per un'eccezione sulla OpenExisting troppo spesso. C'è un modo per verificare se esiste effettivamente lo MemoryMappedFile prima di provare a effettuare la chiamata OpenExisting? O devo affrontare l'eccezione ogni volta?

Inoltre, c'è un modo per scoprire se l'attuale handle è l'ultimo ad avere MemoryMappedFile aperto, per determinare se il file verrà chiuso quando l'handle corrente viene eliminato?

+0

Non capisco la tua domanda. Cosa intendi con "ma finisce per gettare troppo spesso un'eccezione su OpenExisting"? – Krizz

+1

Se provo prima CreateFromFile, genera un'eccezione se è già aperta, se provo prima OpenExisting, genera un'eccezione se non è aperta. Voglio evitare completamente tali eccezioni, se possibile, controllando se esiste. Voglio solo gestire le eccezioni in circostanze davvero eccezionali, non ogni volta che raggiunge quella riga di codice. –

+1

Questo non è un problema reale, è necessario lavorare sul passaggio n. 2 per rendere effettivamente utilizzabile l'MMF. Ciò richiede almeno un mutex denominato per controllare quale processo può scrivere nella memoria mappata. Uno di quei processi deve essere il capo, l'arbitro se vuoi. Deve iniziare prima. –

risposta

0

See Han Passant sotto la domanda iniziale per la risposta accettata. Poiché non posso contrassegnarlo come accettato, mi limiterò a fare riferimento qui e contrassegnarlo come accettato.

0

È possibile utilizzare MemoryMappedFile.CreateOrOpen: il commento di

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

Il problema è che crea solo una mappa di sola memoria, non consente il mapping su un file di file system. C'è un modo per collegarlo a un file dopo che è stato aperto? –

Problemi correlati