2009-08-03 10 views
11

Je voulais jouer avec un MemoryMappedFile pour accéder à un fichier binaire existant. Si c'est même possible ou suis-je une folle?UnauthorizedAccessException sur MemoryMappedFile en C# 4

L'idée serait de mapper le fichier binaire existant directement à la mémoire pour certaines opérations de préférence à vitesse plus élevée. Ou pour voir au moins comment ces choses ont fonctionné.

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

je reçois System.UnauthorizedAccessException était unhandled (Message = L'accès au chemin d'accès est refusé.) Sur la ligne mf.CreateViewAccessor().

Je ne pense pas que ce soit des permissions de fichiers, car je cours en tant qu'utilisateur administrateur non sécurisé, et il n'y a pas d'autres programmes ouverts qui pourraient avoir un verrou en lecture sur le fichier. C'est sur Vista avec UAC désactivé.

Si ce n'est tout simplement pas possible et que j'ai manqué quelque chose dans la documentation, faites-le moi savoir. Je pouvais à peine trouver quoi que ce soit référençant cette fonctionnalité de .net 4.0

Merci!

Répondre

1

Il est difficile de dire ce qui pourrait mal se passer. Comme il n'y a pas encore de documentation sur le site Web de MSDN, le mieux est d'installer FILEMON de SysInternals, et de voir pourquoi cela se produit.

Alternativement, vous pouvez attacher un débogueur natif (comme WinDBG) au processus, et mettre un point d'arrêt sur MapViewOfFile et d'autres surcharges. Et puis voyez pourquoi cet appel échoue.

1

L'utilisation du .CreateViewStream() à partir de l'instance de MemoryMappedFile a supprimé l'erreur de mon code. Je ne pouvais pas obtenir .CreateViewAcccessor() fonctionnait avec l'erreur d'accès refusé

16

Je sais que c'est une vieille question, mais j'ai juste couru dans la même erreur et j'ai pu la résoudre.

Même si j'ouvrais la MemoryMappedFile en lecture seule (MemoryMappedFileRights.Read) que vous êtes, j'ai aussi besoin de créer l'accesseur vue en lecture seule ainsi:

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

Ensuite, cela a fonctionné. J'espère que ceci aide quelqu'un d'autre.

+2

Pour créer un accesseur pour le fichier entier, utilisez 'CreateViewAccessor (0, 0, MemoryMappedFileAccess.Read)' –

6

Si la taille est supérieure à la longueur du fichier, cela donne l'exception d'accès non autorisé. Parce que nous essayons d'accéder à la mémoire au-delà des limites du fichier.

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

Je viens d'avoir ce problème. L'instruction était 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length, MemoryMappedFileAccess.Read)' mais aurait dû être 'mmf.CreateViewStream (contentInfo.From, contentInfo.Length - 1, MemoryMappedFileAccess.Read)'. Je suis d'abord allé à la recherche d'un problème de type ACL, mais maintenant je comprends qu'il signifie «violation de l'accès de la mémoire» – rism

Questions connexes