Вопрос по .net, c# – Записать строковые данные в MemoryMappedFile

4

Я следую этому урокуВот

Мне трудно понять, как получить строку "ЭТО ТЕСТОВОЕ СООБЩЕНИЕ" сохранить в памяти отображенный файл, а затем вытащить его на другой стороне. Учебник говорит использовать байтовый массив. Прости меня, я новичок в этом и пробую самостоятельно в первую очередь.

Спасибо, 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();
    }
}
В «классическом Win32» объект общей памяти должен сохраняться доall ссылки на объект удаляются (т.е. дажеafter первый процесс закрыт). AFAIK, то же самое относится и к программе .Net, работающей под Windows. paulsm4
В: Вы успешно можете написать и прочитать свой Int32 & quot; 42 & quot; на месте 500? Если это так, просто распространите ту же концепцию на байтовые массивы:dotnetperls.com/convert-string-byte-array paulsm4
Я думаю, что у меня есть запись, работающая со строками. Будет тестировать и перепостить изменения кода. kevp
Я пытаюсь сделать так, чтобы одно приложение записало в общую память, закрыло и затем прочитало сообщение. Этот пример, кажется, работает, когда оба включены одновременно. kevp

Ваш Ответ

1   ответ
10

Вы можете записать длину строки, а затем форму вашей строки byte [].
Например, если я хотел бы написать & quot; Привет & quot; затем я конвертирую его в байты:

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

затем выполните следующее во время записи в файл сопоставленной памяти.

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

Во время чтения сначала перейдите в положение 54 и прочитайте 2 байта, содержащих длину вашей строки. Затем вы можете прочитать массив этой длины и преобразовать его в строку.

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));
Error: User Rate Limit Exceeded

Похожие вопросы