2009-08-03 21 views
11

Quería jugar utilizando un MemoryMappedFile para acceder a un archivo binario existente. Si esto es posible o soy una persona loca?UnauthorizedAccessException en MemoryMappedFile en C# 4

La idea sería asignar el archivo binario existente directamente a la memoria para algunas operaciones preferiblemente de mayor velocidad. O al menos ver cómo funcionaban estas cosas.

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

me sale System.UnauthorizedAccessException era no controlada (Mensaje = acceso a la ruta denegado.) En la línea mf.CreateViewAccessor().

No creo que sea un archivo de permisos, ya que me estoy ejecutando como un buen usuario administrador inseguro, y no hay ningún otro programa abierto que pueda tener un bloqueo de lectura en el archivo. Esto está en Vista con UAC deshabilitado.

Si simplemente no es posible y omití algo en la documentación, házmelo saber. Apenas podía encontrar algo que hiciera referencia a esta función de .net 4.0

¡Gracias!

Respuesta

1

Es difícil decir lo que podría estar yendo mal. Como todavía no hay documentación en el sitio web de MSDN, su mejor opción es instalar FILEMON en SysInternals y ver por qué ocurre esto.

Alternativamente, puede adjuntar un depurador nativo (como WinDBG) al proceso, y poner un punto de interrupción en MapViewOfFile y otras sobrecargas. Y luego vea por qué esa llamada está fallando.

1

El uso de .CreateViewStream() desde la instancia de MemoryMappedFile eliminó el error de mi código. No pude obtener .CreateViewAcccessor() trabajando con el error de acceso denegado

16

Sé que esta es una pregunta antigua, pero me encontré con el mismo error y pude resolverlo.

A pesar de que estaba abriendo el archivo proyectado en memoria como como eres, yo también necesitaba para crear la vista de acceso como de sólo lectura, así como de sólo lectura (MemoryMappedFileRights.Read):

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

Entonces funcionó. Espero que esto ayude a alguien más.

+2

Para crear un descriptor de acceso para todo el archivo, usar 'CreateViewAccessor (0, 0, MemoryMappedFileAccess.Read)' –

6

Si el tamaño es más que la longitud del archivo, ofrece la excepción Acceso no autorizado. Porque estamos intentando acceder a la memoria más allá de los límites del archivo.

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

acabo de tener este problema. La declaración fue 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length, MemoryMappedFileAccess.Read)' pero debería haber sido 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length - 1, MemoryMappedFileAccess.Read)'. Inicialmente fui en busca de un problema tipo ACL, pero ahora entiendo que significa 'violación de acceso a memoria' – rism

Cuestiones relacionadas