Write string data to MemoryMappedFile

20,897

Solution 1

You can consider writing the length of the string and then the byte[] form of your string.
For example if I would like to write "Hello" then I convert it into bytes:

byte[] Buffer = ASCIIEncoding.ASCII.GetBytes("Hello");

then do following while writing into the memory mapped file.

MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", 1000);
MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
accessor.Write(54, (ushort)Buffer.Length);
accessor.WriteArray(54 + 2, Buffer, 0, Buffer.Length);

While reading first go to position 54 and read 2 bytes holding length of your string. Then you can read an array of that length and convert it into string.

MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", 1000);
MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
ushort Size = accessor.ReadUInt16(54);
byte[] Buffer = new byte[Size];
accessor.ReadArray(54 + 2, Buffer, 0, Buffer.Length); 
MessageBox.Show(ASCIIEncoding.ASCII.GetString(Buffer));

Solution 2

It Works fine with CreateOrOpen instead of CreateNew! With the same code

MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("test", 1000);
MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
accessor.Write(54, (ushort)Buffer.Length);
accessor.WriteArray(54 + 2, Buffer, 0, Buffer.Length);

and

MemoryMappedFile mmf = MemoryMappedFile.CreateOrOpen("test", 1000);
MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
ushort Size = accessor.ReadUInt16(54);
byte[] Buffer = new byte[Size];
accessor.ReadArray(54 + 2, Buffer, 0, Buffer.Length); 
MessageBox.Show(ASCIIEncoding.ASCII.GetString(Buffer));

Solution 3

I used this to write the characters of a string:

string contentString = "Hello";
char[] charsToWrite = contentString.ToCharArray();
accessor.WriteArray(0, charsToWrite, 0, charsToWrite.Length);

This wrote wide characters. Both C# and C++ programs were able to read the data as wide characters.

Share:
20,897
kevp
Author by

kevp

Working with GIS, building mapping software!

Updated on July 16, 2022

Comments

  • kevp
    kevp almost 2 years

    I am following this tutorial here

    I am having a hard time figuring out how to get a string "THIS IS A TEST MESSAGE" to store in the memory mapped file and then pull it out on the other side. The tutorial says to use byte array. Forgive me I am new to this and trying on my own first.

    Thanks, Kevin

    ##Write to mapped file
    
    using System;
    using System.IO.MemoryMappedFiles;
    
    class Program1
    {
        static void Main()
        {
            // create a memory-mapped file of length 1000 bytes and give it a 'map name' of 'test'
            MemoryMappedFile mmf = MemoryMappedFile.CreateNew("test", 1000);
            // write an integer value of 42 to this file at position 500
            MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
            accessor.Write(500, 42);
            Console.WriteLine("Memory-mapped file created!");
            Console.ReadLine(); // pause till enter key is pressed
            // dispose of the memory-mapped file object and its accessor
            accessor.Dispose();
            mmf.Dispose();
        }
    }   
    
    
    ##read from mapped file  
    using System;
    using System.IO.MemoryMappedFiles;
    class Program2
    {
        static void Main()
        {
            // open the memory-mapped with a 'map name' of 'test'
            MemoryMappedFile mmf = MemoryMappedFile.OpenExisting("test");
            // read the integer value at position 500
            MemoryMappedViewAccessor accessor = mmf.CreateViewAccessor();
            int value = accessor.ReadInt32(500);
            // print it to the console
            Console.WriteLine("The answer is {0}", value);
            // dispose of the memory-mapped file object and its accessor
            accessor.Dispose();
            mmf.Dispose();
        }
    }