2

C# の MemoryMappedFiles に問題があります。1 つのプロセスのみを使用している場合は完全に機能しますが、別のプロセスから mmf ファイルにアクセスしようとするとすぐに、これが許可されているというエラーが表示されます。

受信データをmmfファイルに書き込むデータロガーがあります。

private void WriteRawToFile(.....)
    {
        MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
        security.AddAccessRule(new AccessRule<MemoryMappedFileRights>(("Everyone"), MemoryMappedFileRights.FullControl, AccessControlType.Allow));

        using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(new FileStream(@"data.mmf", FileMode.OpenOrCreate), "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute, security, HandleInheritability.Inheritable, false))
        {
            using (MemoryMappedViewAccessor view = mmf.CreateViewAccessor(size*rawId, size, MemoryMappedFileAccess.CopyOnWrite))
            {
                    view.WriteArray(....);
            }
        }
    }

このファイルから (別のクラスから) 読み取る他のスレッド (およびメインスレッド):

private float[] ReadRawFromFile(....)
        {
            MemoryMappedFileSecurity security = new MemoryMappedFileSecurity();
            security.AddAccessRule(new AccessRule<MemoryMappedFileRights>(("Everyone"), MemoryMappedFileRights.FullControl, AccessControlType.Allow));
            using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile(new FileStream(@"data.mmf", FileMode.OpenOrCreate), "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute, security, HandleInheritability.Inheritable, false))
            {
                using (MemoryMappedViewAccessor view = mmf.CreateViewAccessor(size*rawId, size, MemoryMappedFileAccess.Read))
                {
                    view.ReadArray(....);
                }
            }
            return res;
        }

このコードでは、読み取り中に例外が発生します。

Some or all identity references could not be translated.

最初に、MemoryMappedFileSecurity なしで試してみました。

using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("data.mmf", FileMode.OpenOrCreate , "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.ReadWriteExecute))
using (MemoryMappedFile mmf = MemoryMappedFile.CreateFromFile("data.mmf", FileMode.Open, "mmf", Int32.MaxValue / 100, MemoryMappedFileAccess.Read))

しかし、その後、別の例外が発生しました:

The process cannot access the file 'data.mmf' because it is being used by another process.

私は何を間違っていますか、私はこれまで解決策を見つけることができませんでした。

4

1 に答える 1

1

このエラー メッセージは、セキュリティとは関係ありません。同じファイルへのファイル共有アクセスについてです。

あなたが使用したオーバーロードは、リフレクターに応じてCreateFromFile常に使用されます。FileShare.Noneそれは役に立たないようです。より良いオーバーロードを使用してください。ここでは、FileStream自分自身を作成し​​、適切な共有モードを使用できます。

于 2015-08-11T11:56:21.163 に答える