我使用MemoryMappedFile进行2个程序之间的通信。程序“A”创建mmf并在计时器上读取它的内容。程序“B”将xml数据写入计时器上的mmf。我有内存映射工作,但我遇到一个问题,XML数据的上一次迭代比当前和旧数据转移到下一轮更长。
为简单起见,我们假设程序B写
AAAA
程序A将正确读取,
然后程序B的下一次写入是:
B'/ P>
程序A读取
BAAA
似乎应该有一些简单的方法来刷新内存映射文件的内容,但我似乎无法搞清楚。我很可能在这方面做错了。
这就是我目前正在做的事情。
计划A:
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap",MemoryMappedFileRights.ReadWrite))
{
Mutex mutex = Mutex.OpenExisting("testmapmutex");
mutex.WaitOne();
string outputtext;
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0,0))
{
XmlSerializer deserializer = new XmlSerializer(typeof(MyObject));
TextReader textReader = new StreamReader(stream);
outputtext = textReader.ReadToEnd();
textReader.Close();
}
mutex.ReleaseMutex();
return outputtext; //ends up in a textbox for debugging
}
计划B
using (MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("testmap", MemoryMappedFileRights.ReadWrite))
{
Mutex mutex = Mutex.OpenExisting("testmapmutex");
mutex.WaitOne();
using (MemoryMappedViewStream stream = mmf.CreateViewStream(0, 0))
{
XmlSerializer serializer = new XmlSerializer(typeof(MyObject));
TextWriter textWriter = new StreamWriter(stream);
serializer.Serialize(textWriter, myObjectToExport);
textWriter.Flush();
}
mutex.ReleaseMutex();
}
答案 0 :(得分:0)
假设length
很小,您可以真的将其清除
textWriter.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);
textWriter.BaseStream.Write(new byte[length], 0, length);
textWriter.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);
编辑:我认为我误解了OP的问题。他遇到的问题不是清除MMF的内容,而是流操作。这应该可以解决问题:
textWriter.BaseStream.Seek(0, System.IO.SeekOrigin.Begin);
textWriter.Write("");
textWriter.Flush();
话虽这么说,您可能要两者都做。
答案 1 :(得分:-1)
我还没有真正使用过MemoryMappedStreams,但这个问题看起来很有趣,所以我对它进行了一次破解。我写了一个非常基本的Windows示例,其中包含两个按钮(读/写)和一个文本框。我没有将“0,0”传递给CreateViewStream调用,而是使用对“CreateOrOpen”的调用创建了具有固定长度的文件,一切运行良好!以下是我写的关键代码:
阅读文件
// create the file if it doesn't exist
if (sharedFile == null) sharedFile = MemoryMappedFile.CreateOrOpen("testmap", 1000, MemoryMappedFileAccess.ReadWrite);
// process safe handling
Mutex mutex = new Mutex(false, "testmapmutex");
if (mutex.WaitOne()) {
try {
using (MemoryMappedViewStream stream = sharedFile.CreateViewStream()) {
var writer = new StreamWriter(stream);
writer.WriteLine(txtResult.Text);
writer.Flush();
}
}
finally { mutex.ReleaseMutex(); }
}
写文件
// create the file if it doesn't exist
if (sharedFile == null) sharedFile = MemoryMappedFile.CreateOrOpen("testmap", 1000, MemoryMappedFileAccess.ReadWrite);
// process safe handling
Mutex mutex = new Mutex(false, "testmapmutex");
if (mutex.WaitOne()) {
try {
using (MemoryMappedViewStream stream = sharedFile.CreateViewStream()) {
var textReader = new StreamReader(stream);
txtResult.Text = textReader.ReadToEnd();
textReader.Close();
}
}
finally { mutex.ReleaseMutex(); }
}
处置文件(完成后)
if (sharedFile != null) sharedFile.Dispose();
有关完整示例,请参阅此处:https://github.com/goopyjava/memory-map-test。希望有所帮助!
编辑/注意 - 如果您查看提供的示例,您可以根据需要多次写入文件,并且无论何时阅读,您都会完全阅读/仅阅读最后写的内容。我相信这是问题的最初目标。