启用写入映射到内存的文件

时间:2012-09-10 19:57:24

标签: c# memory-mapped-files memory-mapping

我想使用内存映射文件来虚拟化打开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上阅读但不能保存它:

enter image description here

请注意我是如何打开文件的(同时数据是在内存而不是硬盘),但是当我尝试保存更改时,我无法进行更改。 所以我的问题是:我如何启用对该文件的保存更改,只是更改内存映射文件的内存中的内容,而不实际尝试将任何内容保存到磁盘。

1 个答案:

答案 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;
    }