UnauthorizedAccessException для MemoryMappedFile в C # 4 - PullRequest
12 голосов
/ 03 августа 2009

Я хотел поиграть с использованием 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);

Я получаю исключение System.UnauthorizedAccessException (сообщение = доступ к пути запрещен.) В строке mf.CreateViewAccessor ().

Я не думаю, что это права доступа к файлам, так как я работаю как хороший незащищенный пользователь-администратор, и нет никаких других открытых программ, которые могли бы иметь блокировку чтения файла. Это на Vista с отключенным UAC.

Если это просто невозможно, и я что-то пропустил в документации, пожалуйста, дайте мне знать. Я едва мог найти что-либо вообще, ссылаясь на эту функцию .net 4.0

Спасибо!

Ответы [ 4 ]

19 голосов
/ 13 июня 2010

Я знаю, что это старый вопрос, но я столкнулся с той же ошибкой и смог ее решить.

Несмотря на то, что я открывал MemoryMappedFile как доступный только для чтения (MemoryMappedFileRights.Read), как и вы, мне также нужно было создать средство доступа к представлениям только для чтения:

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

Тогда это сработало. Надеюсь, это поможет кому-то еще.

7 голосов
/ 05 сентября 2013

Если размер превышает длину файла, это дает исключение UnAuthorized Access. Потому что мы пытаемся получить доступ к памяти за пределами файла.

var view = mmf.CreateViewAccessor(offset, size, MemoryMappedFileAccess.Read);
1 голос
/ 06 ноября 2009

Использование .CreateViewStream () из экземпляра MemoryMappedFile удалило ошибку из моего кода. Мне не удалось заставить работать .CreateViewAcccessor () с ошибкой отказа в доступе

1 голос
/ 12 сентября 2009

Трудно сказать, что может быть не так. Поскольку на веб-сайте MSDN нет документации, лучше всего установить FILEMON из SysInternals и посмотреть, почему это происходит.

Кроме того, вы можете присоединить к процессу собственный отладчик (например, WinDBG) и установить точку останова для MapViewOfFile и других перегрузок. А затем посмотрите, почему этот вызов не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...