【发布时间】: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