Включить запись в файл, который отображается в память

Я хотел бы использовать отображенный в памяти файл для виртуализации открытия файла в Windows, когда этот файл действительно появится в Интернете.

Поэтому я создаю файл отображения памяти как:

// data that we write to the file. we will get this a tcp
var data = System.Text.Encoding.UTF8.GetBytes("Hello World");

var fileStream = new FileStream("SomeFile.txt", FileMode.Create);

using (MemoryMappedFile memoryMapped = MemoryMappedFile.CreateFromFile(fileStream, "MapName", 1024, 
    MemoryMappedFileAccess.ReadWrite, new MemoryMappedFileSecurity(), HandleInheritability.Inheritable, true))
{
    var viewStream = memoryMapped.CreateViewStream();                
    viewStream.Write(data, 0, data.Length); // write hello world                                
}

И я могу читать из него на окнах, но не сохранять его:

Обратите внимание, как я смог открыть файл (вто время как данные были в памяти, а не на жестком диске), но в тот момент, когда я попытался сохранить изменения, я не смог. Итак, мой вопрос: как я могу разрешить сохранение изменений в этом файле и просто изменить содержимое в памяти отображенного в памяти файла, фактически не пытаясь что-либо сохранить на диск.

1 ответ

Решение

Вам необходимо указать режим обмена при создании файлового потока.

var fileStream = 
    new FileStream("SomeFile.txt", FileMode.Create, 
                   FileAccess.ReadWrite, FileShare.ReadWrite);

Кроме того, вам нужно избавиться от FileStream, когда это будет сделано, например, с помощью оператора using.

ОБНОВИТЬ

Это работало просто отлично для меня. Используя Блокнот, мне пришлось заново открыть файл вручную, но я мог обновить его, когда Блокнот был открыт (Блокнот просто не проверял внешние изменения).

Примечание: код записывает группу NUL (0x00) байтов в конец файла. Возможно, вы захотите разобраться в этом.

Вот точный код, который я использовал (обратите внимание на локальный путь к C:\Temp. Измените при необходимости):

    static private void WriteMMF()
    {
        // data that we write to the file. we will get this a tcp
        var data = System.Text.Encoding.UTF8.GetBytes("Hello World 2");

        using (var fileStream = new FileStream(@"C:\Temp\SomeFile.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite))
        using (MemoryMappedFile memoryMapped = MemoryMappedFile.CreateFromFile(fileStream, "MapName", 1024,
            MemoryMappedFileAccess.ReadWrite, new MemoryMappedFileSecurity(), HandleInheritability.Inheritable, true))
        {
            var viewStream = memoryMapped.CreateViewStream();
            viewStream.Write(data, 0, data.Length); // write hello world                                
        }
    }


    static void Main(string[] args)
    {
        Console.WriteLine("Writing MMF");

        WriteMMF();

        Console.WriteLine("Done.  Press a key.");
        var ch = Console.ReadKey();

        return;
    }
Другие вопросы по тегам