Включить запись в файл, который отображается в память
Я хотел бы использовать отображенный в памяти файл для виртуализации открытия файла в 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;
}