13

我想尝试使用 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);

我在 mf.CreateViewAccessor() 行上得到 System.UnauthorizedAccessException was unhandled (Message=Access to the path is denied.)。

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

如果这根本不可能并且我错过了文档中的某些内容,请告诉我。我几乎找不到任何引用 .net 4.0 的这个特性的东西

谢谢!

4

4 回答 4

25

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

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

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

然后它起作用了。希望这对其他人有帮助。

于 2010-06-13T19:09:18.667 回答
11

如果大小超过文件长度,则会给出未经授权的访问异常。因为我们试图访问超出文件限制的内存。

var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read);
于 2013-09-05T09:23:51.777 回答
1

使用 MemoryMappedFile 实例中的 .CreateViewStream() 从我的代码中删除了错误。我无法让 .CreateViewAcccessor() 工作并出现访问被拒绝错误

于 2009-11-06T17:05:37.233 回答
1

很难说可能出了什么问题。由于 MSDN 网站上还没有文档,最好的办法是从 SysInternals 安装 FILEMON,看看为什么会这样。

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

于 2009-09-11T21:40:04.343 回答