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

时间:2014-01-04 22:59:35

标签: c#

我使用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();

}

2 个答案:

答案 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。希望有所帮助!

编辑/注意 - 如果您查看提供的示例,您可以根据需要多次写入文件,并且无论何时阅读,您都会完全阅读/仅阅读最后写的内容。我相信这是问题的最初目标。