我想使用内存映射文件来虚拟化打开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
}
我可以在Windows上阅读但不能保存它:
请注意我是如何打开文件的(同时数据是在内存而不是硬盘),但是当我尝试保存更改时,我无法进行更改。 所以我的问题是:我如何启用对该文件的保存更改,只是更改内存映射文件的内存中的内容,而不实际尝试将任何内容保存到磁盘。
答案 0 :(得分:2)
创建文件流时需要指定共享模式。
var fileStream =
new FileStream("SomeFile.txt", FileMode.Create,
FileAccess.ReadWrite, FileShare.ReadWrite);
此外,您需要在完成后丢弃FileStream,例如使用使用语句。
<强>更新强>
它对我来说很好。使用记事本我不得不手动重新打开文件,但我可以在记事本打开时更新它(记事本只是没有检查外部修改)。
附注:代码将一堆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;
}