代码之家  ›  专栏  ›  技术社区  ›  Kevin Nisbet

C#4中MemoryMappedFile的未授权访问异常

  •  12
  • Kevin Nisbet  · 技术社区  · 17 年前

    我想尝试使用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()行上,未处理I get System.UnauthorizedAccessException(消息=拒绝访问路径)。

    如果这根本不可能,而且我在文档中遗漏了一些东西,请让我知道。我几乎找不到任何引用.NET4.0这个特性的东西

    谢谢

    4 回复  |  直到 17 年前
        1
  •  24
  •   PatrickSteele    16 年前

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

    即使我像您一样以只读方式打开MemoryMappedFiles(memoryMappedFilers.read),我也需要以只读方式创建视图访问器:

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

        2
  •  11
  •   dhinesh    12 年前

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

    var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read);
    
        3
  •  1
  •   feroze    16 年前

    很难说到底出了什么问题。因为MSDN网站上还没有文档,所以最好从SysInternals安装FILEMON,看看为什么会这样。

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

        4
  •  1
  •   Mark    16 年前

    使用MemoryMappedFile实例中的.CreateViewStream()可以从我的代码中删除错误。由于访问被拒绝错误,我无法使.createViewAccessor()工作