UnauthorizedAccessException для MemoryMappedFile в С# 4

Я хотел поиграть с использованием 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 был необработанным (Message = Доступ к пути запрещен.) в строке mf.CreateViewAccessor().

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

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

Спасибо!

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

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