C#4中MemoryMappedFile上的UnauthorizedAccessException

Kev*_*bet 12 .net-4.0 visual-studio-2010 c#-4.0

我想使用MemoryMappedFile来访问现有的二进制文件.如果这甚至可能,或者我是一个疯狂的人?

想法是将现有的二进制文件直接映射到存储器以进行某些优选更高速的操作.或者至少看看这些东西是如何起作用的.

        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);
Run Code Online (Sandbox Code Playgroud)

我在mf.CreateViewAccessor()行上未处理System.UnauthorizedAccessException(Message =访问路径被拒绝.).

我不认为它是文件权限,因为我作为一个不安全的管理员用户运行,并且没有任何其他程序打开可能对文件具有读锁定.这是在禁用UAC的Vista上.

如果它根本不可能而我错过了文档中的内容,请告诉我.我几乎找不到任何引用.net 4.0的这个功能的东西

谢谢!

Pat*_*ele 19

我知道这是一个老问题,但我遇到了同样的错误,并且能够解决它.

即使我按原样打开MemoryMappedFile(MemoryMappedFileRights.Read),我也需要以只读方式创建视图访问器:

var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read);
Run Code Online (Sandbox Code Playgroud)

然后它奏效了.希望这有助于其他人.

  • 要为整个文件创建一个访问器,请使用`CreateViewAccessor(0,0,MemoryMappedFileAccess.Read)` (2认同)

dhi*_*esh 8

如果大小超过文件长度,则会提供UnAuthorized Access异常.因为我们试图访问超出文件限制的内存.

var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read);
Run Code Online (Sandbox Code Playgroud)

  • 我刚遇到这个问题。语句是 `mmf.CreateViewStream(contentInfo.From, contentInfo.Length, MemoryMappedFileAccess.Read)` 但应该是 `mmf.CreateViewStream(contentInfo.From, contentInfo.Length - 1, MemoryMappedFileAccess.Read)`。我最初继续寻找 ACL 类型问题,但现在我明白它的意思是“内存访问冲突” (2认同)

fer*_*oze 1

很难说可能出了什么问题。由于 MSDN 网站上还没有文档,因此最好的选择是从 SysInternals 安装 FILEMON,并了解为什么会发生这种情况。

或者,您可以将本机调试器(如 WinDBG)附加到进程,并在 MapViewOfFile 和其他重载上放置断点。然后看看为什么该调用失败。