C#MemoryMappedFile - Read& S的不同进程写

时间:2015-08-11 10:45:17

标签: c# memory-mapped-files file-security

我在C#中遇到了MemoryMappedFiles的问题。 当我只使用一个进程时,它们工作正常,但是一旦我尝试从不同进程访问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.

我做错了什么,到目前为止我找不到解决方案。

1 个答案:

答案 0 :(得分:1)

此错误消息与安全性无关。它是关于对同一文件的文件共享访问。

根据反射器,您使用的CreateFromFile重载始终使用FileShare.None。这似乎没用。 Use a better overload.在这里,您可以自己创建FileStream并使用正确的共享模式。