2009-08-03 7 views
11

私はMemoryMappedFileを使って既存のバイナリファイルにアクセスして遊びたがっていました。これがすべて可能であっても、私は狂った人ですか?C#4のMemoryMappedFileのUnauthorizedAccessException

考えられるのは、既存のバイナリファイルをメモリに直接マップして、高速処理を行うことです。または、これらの事がどのように機能したかを少なくとも見てください。

 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のこの機能を参照してください。

ありがとう!

答えて

1

何がうまくいかないかもしれないと言うのは難しいです。 MSDNのWebサイトにはまだドキュメントがありませんので、SysInternalsからFILEMONをインストールし、それがなぜ起こっているのかを確認することをお勧めします。

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

1

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

16

これは古い質問ですが、同じエラーが発生して解決できました。

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

そして、それが働いた:私は読み取り専用(MemoryMappedFileRights.Read)あなたは、私も読み取り専用だけでなく、ビュー・アクセッサを作成するために必要とされるほどのメモリマップトファイルを開いた場合でも

。これが他の人に役立つことを願っています

+2

、 '' –

6

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

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

CreateViewAccessor(0、0、MemoryMappedFileAccess.Read)を使用して私はこの問題を抱えていました。ステートメントは 'mmf.CreateViewStream(contentInfo.From、contentInfo.Length、MemoryMappedFileAccess.Read)'でしたが、 'mmf.CreateViewStream(contentInfo.From、contentInfo.Length - 1、MemoryMappedFileAccess.Read)'であったはずです。私は当初、ACL型問題の捜索に行きましたが、今は 'メモリアクセス違反' – rism

関連する問題