【问题标题】:C# MemoryMappedFile - Different Processes for Read & WriteC# MemoryMappedFile - 读写的不同进程
【发布时间】:2015-08-11 10:45:17
【问题描述】:

我对 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.

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

【问题讨论】:

  • 此消息极为常见。你搜索了吗?
  • 我发现了六个问题,几乎和我的一样,但都没有真正帮助我。
  • 您可能希望通过使用严格基于内存的 mmf 来回避此文件访问问题(使用 CreateNew 而不是 CreateFromFile)。
  • 是的,这是互联网提供的主要解决方案,但我有大量数据(如 100GB-1TB),所以我需要将其保存在硬盘上(并随时访问它)时间点)。

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


【解决方案1】:

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

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

【讨论】:

  • 我将 Filestreams 更改为 new FileStream(@"data.mmf", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite),但现在出现另一个异常:访问路径被拒绝。
  • 发布完整的异常 ToString。并删除您的安全码。
  • System.Core.dll 中出现“System.UnauthorizedAccessException”类型的未处理异常附加信息:访问路径被拒绝。
  • 这意味着文件安全不允许访问。修复它。可能是你之前实验的残余。也许您应该尝试在谷歌上搜索更多错误消息。这不难弄清楚。
  • 问题是我试图管理读写权限。 Streams FileAccess 和 FileShare,MemoryMappedFileAccess 也必须设置为 ReadWrite(仅此而已),即使只读取数据也是如此。我不明白为什么,但它现在有效。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 2012-11-20
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多