I Memory-Mapped File sono un'altra interessante novità del nuovo .NET Framework 4.0. Un memory-mapped file non è altro che un file il cui contenuto viene posizionato in memoria per essere utilizzato. Ovvero, possiamo manipolare il contenuto di un file in memoria piuttosto che su disco. Questo comporta ovvi vantaggi soprattutto quando si ha la necessità di leggere e scrivere sul file da più processi distinti. Vi sono due diverse tipologie di memory-mapped file:
- memory-mapped file persistenti
- memory-mapped file non persistenti
I primi sono file in memoria che hanno un corrispondente file "fisico" sul disco. Quando si è terminato di lavorare sul file in memoria i dati vengono salvati nel file fisico su disco. I memory-mapped file non persistenti sono invece file in memoria che non sono associati ad un file su disco. Questi memory-mapped file vengono utilizzati e quando non sono più necessari il loro contenuto viene sottoposto a garbage collection.
Il campo in cui sono quindi più utili i memory-mapped file è quello della comunicazione inter-processo in cui il loro uso consente a più processi di scambiarsi dati in maniera semplice.
Per creare un memory-mapped file utilizziamo la classe System.IO.MemoryMappedFiles ed in particolare tra gli altri, il metodo CreateFromFile per ottenere un memory-mapped file persistente:
MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(@"c:\myfile.dat", FileMode.Open,"ImgA");
Come vediamo, questo metodo richiede il nome del file da cui creare il memory-mapped file, la modalità di accesso al file ed infine un nome da assegnare al file in memoria. Questo nome potrà essere utilizzato dagli altri processi per accedere allo stesso file e quindi scambiarsi informazioni.
Dopo aver creato un memory-mapped file, prima di poter accedere ad esso, è necessario creare una vista su di esso. Una vista può fornire accesso all'intero file o anche solo ad una porzione di esso:
MemoryMappedViewAccessor view = mmf.CreateViewAccessor(offset, length);
oppure
MemoryMappedViewAccessor view = mmf.CreateViewAccessor();
Il metodo di istanza CreateViewAccessor crea una vista sul file a partire da un certo offset (0 se vogliamo partire dall'inizio del file) fino alla dimensione specificata dal secondo parametro. Altrimenti, se desideriamo avere accesso al file per intero, possiamo utilizzare il costruttore senza parametri, come nel secondo esempio.