[英]Clearing contents of memory mapped file in C#
我正在使用 MemoryMappedFile 进行 2 个程序之间的通信。 程序“A”创建 mmf 并在计时器上读取其内容。 程序“B”在计时器上将 xml 数据写入 mmf。 我有内存映射工作,但我遇到了一个问题,即 XML 数据的前一次迭代比当前和旧数据要长到下一轮。
所以为了简单起见,让我们说程序 B 写
啊啊啊
程序 A 将正确读取,
然后程序 B 的下一个写入是:
乙
程序A读取
咩咩
似乎应该有一些简单的方法来刷新内存映射文件的内容,但我似乎无法弄清楚。 我很可能在处理这件事的方式上完全错了。
这就是我目前正在做的事情。
程序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();
}
假设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();
话虽如此,您可能想要两者都做。
我并没有真正使用 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 。 希望有帮助!
编辑/注意- 如果您查看提供的示例,您可以根据需要多次写入文件,并且每次阅读时,您都将准确读取/仅读取最后写入的内容。 我相信这是问题的最初目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.