2009-08-03 6 views
11

Volevo giocare con l'utilizzo di un MemoryMappedFile per accedere a un file binario esistente. Se questo è anche possibile o sono una persona pazza?Non autorizzatoAccessException su MemoryMappedFile in C# 4

L'idea sarebbe quella di mappare il file binario esistente direttamente in memoria per alcune operazioni preferibilmente più veloci. O almeno vedere come funzionavano queste cose.

 using System.IO.MemoryMappedFiles; 


     System.IO.FileInfo fi = new System.IO.FileInfo(@"C:\testparsercap.pcap"); 
     MemoryMappedFileSecurity sec = new MemoryMappedFileSecurity(); 
     System.IO.FileStream file = fi.Open(System.IO.FileMode.Open, System.IO.FileAccess.ReadWrite, System.IO.FileShare.ReadWrite); 
     MemoryMappedFile mf = MemoryMappedFile.CreateFromFile(file, "testpcap", fi.Length, MemoryMappedFileAccess.Read, sec, System.IO.HandleInheritability.Inheritable, true); 
     MemoryMappedViewAccessor FileMapView = mf.CreateViewAccessor(); 
     PcapHeader head = new PcapHeader(); 
     FileMapView.Read<PcapHeader>(0, out head); 

ottengo System.UnauthorizedAccessException è stata gestita (Messaggio = L'accesso al percorso è negato.) Sulla linea mf.CreateViewAccessor().

Non penso sia un file-permessi, dato che sto correndo come un simpatico utente amministratore insicuro, e non ci sono altri programmi aperti che potrebbero avere un blocco di lettura sul file. Questo è su Vista con UAC disabilitato.

Se semplicemente non è possibile e ho perso qualcosa nella documentazione, fatemelo sapere. Riuscivo a malapena a trovare niente affatto riferimento a questa funzionalità di .NET 4.0

Grazie!

risposta

1

È difficile dire cosa potrebbe andare storto. Poiché non esiste ancora alcuna documentazione sul sito Web MSDN, la soluzione migliore è installare FILEMON da SysInternals e vedere perché ciò sta accadendo.

In alternativa, è possibile collegare un debugger nativo (come WinDBG) al processo e inserire un punto di interruzione su MapViewOfFile e altri sovraccarichi. E poi vedi perché quella chiamata sta fallendo.

1

L'utilizzo di .CreateViewStream() dall'istanza di MemoryMappedFile ha rimosso l'errore dal mio codice. Non ero in grado di ottenere .CreateViewAcccessor() funzionante con l'accesso negato errore

16

So che questa è una vecchia domanda, ma mi sono imbattuto nello stesso errore e sono riuscito a risolverlo.

Anche se stavo aprendo il file mappato in memoria di sola lettura (MemoryMappedFileRights.Read) come sei, ho anche bisogno di creare la funzione di accesso vista in sola lettura così:

var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read); 

Poi ha funzionato. Spero che questo aiuti qualcun altro.

+2

Per creare una funzione di accesso per l'intero file, utilizzare 'CreateViewAccessor (0, 0, MemoryMappedFileAccess.Read)' –

6

Se la dimensione supera la lunghezza del file, fornisce l'eccezione di accesso non autorizzato. Perché stiamo cercando di accedere alla memoria oltre i limiti del file.

var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read); 
+0

Ho appena avuto questo problema. La dichiarazione è stata 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length, MemoryMappedFileAccess.Read)', ma avrebbe dovuto essere 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length - 1, MemoryMappedFileAccess.Read)'. Inizialmente sono andato a caccia di problemi di tipo ACL, ma ora capisco che significa "violazione di accesso alla memoria" – rism