C#4中MemoryMappedFile上的UnauthorizedAccessException

时间:2009-08-03 06:41:01

标签: visual-studio-2010 .net-4.0 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);

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

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

如果根本不可能而且我遗漏了文档中的内容,请告诉我。我几乎找不到任何引用.net 4.0

的功能的内容

谢谢!

4 个答案:

答案 0 :(得分:19)

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

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

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

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

答案 1 :(得分:7)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

使用MemoryMappedFile实例中的.CreateViewStream()从我的代码中删除了错误。我无法得到.CreateViewAcccessor()工作w /访问被拒绝错误