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);

System.UnauthorizedAccessException was unhandled (Message=Access to the path is denied.) が mf.CreateViewAccessor() 行に表示されます。

私は安全でない管理者ユーザーとして実行しており、ファイルに読み取りロックを設定している可能性のある他のプログラムが開いていないため、ファイルのアクセス許可ではないと思います。これは、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

サイズがファイルの長さを超える場合、UnAuthorized Access 例外が発生します。ファイルの制限を超えてメモリにアクセスしようとしているからです。

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

何が問題なのかを判断するのは困難です。MSDN の Web サイトにはまだドキュメントがないため、SysInternals から FILEMON をインストールし、その理由を確認することをお勧めします。

または、ネイティブ デバッガー (WinDBG など) をプロセスにアタッチし、MapViewOfFile やその他のオーバーロードにブレークポイントを設定することもできます。そして、その呼び出しが失敗する理由を確認します。

于 2009-09-11T21:40:04.343 に答える
1

MemoryMappedFile のインスタンスから .CreateViewStream() を使用すると、コードからエラーが削除されました。アクセス拒否エラーで .CreateViewAccessor() を動作させることができませんでした

于 2009-11-06T17:05:37.233 に答える