3

当该文件真正在互联网上时,我想使用内存映射文件来虚拟化在 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 上读取它,但不能保存它:

在此处输入图像描述

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

4

1 回答 1

2

创建文件流时需要指定共享模式。

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;
    }
于 2012-09-10T20:00:25.047 回答