C#MemoryMappedFile-不同的读和写过程;写

C#MemoryMappedFile-不同的读和写过程;写,c#,memory-mapped-files,file-security,C#,Memory Mapped Files,File Security,我对C#中的memorymappedfile有一些问题。 当我只使用一个进程时,它们工作得很好,但是当我尝试从不同的进程访问mmf文件时,我得到了允许的错误 我有一个数据记录器,它将传入数据写入mmf文件: private void WriteRawToFile(.....) { MemoryMappedFileSecurity security = new MemoryMappedFileSecurity(); security.AddAccessRul

我对C#中的memorymappedfile有一些问题。 当我只使用一个进程时,它们工作得很好,但是当我尝试从不同的进程访问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(....);
            }
        }
    }
最初我在没有记忆缺失的情况下尝试过:

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.

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

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


您使用的
CreateFromFile
重载始终使用
FileShare.None
根据reflector。这似乎没有用。在这里,您可以自己创建
文件流
,并使用适当的共享模式。

此消息非常常见。你搜索过了吗?我发现了半打问题,几乎和我的一样,但都没有帮到我。你可能想通过使用严格基于内存的mmf(使用
CreateNew
而不是
CreateFromFile
)来回避这个文件访问问题。是的,这是互联网提供的主要解决方案,但是我有大量的数据(比如100GB-1TB),所以我需要将其保存在硬盘上(并在任何时候访问)。我将文件流更改为
新文件流(@“data.mmf”、FileMode.OpenOrCreate、FileAccess.ReadWrite、FileShare.ReadWrite)
,但现在我得到了另一个异常:对路径的访问被拒绝。将完整异常发布到字符串。并删除您的安全代码。System.Core.dll中发生类型为“System.UnauthorizedAccessException”的未处理异常。其他信息:对路径的访问被拒绝。这意味着文件安全不允许访问。解决这个问题。可能是你以前实验的残余。也许你应该尝试用谷歌搜索更多的错误信息。这不难理解。问题是我试图管理读写权限。Streams FileAccess和FileShare以及MemoryMappedFileAccess必须设置为ReadWrite(而不是其他),即使仅在读取数据时也是如此。我不明白为什么,但它现在起作用了。
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.