繁体   English   中英

清除C#中内存映射文件的内容

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM