【问题标题】:Enable writing to file that is mapped to memory启用写入映射到内存的文件
【发布时间】:2012-09-10 19:57:24
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案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;
        }
    

    【讨论】:

    • +1 的帮助谢谢!我仍然无法从 Windows 资源管理器中保存更改。我想我在问什么是不可能的吧?
    • @TonoNam:您的屏幕截图显示的是记事本。记事本可能会尝试以不利于共享的方式打开文件。尝试在 Notepad++ 之类的编辑器中打开它,或者只在 Visual Studio 中打开它。两者都可以很好地配合外部更新。
    • 仍然无法从 Windows 资源管理器中修改它。也许我会尝试做一个 console.Read() 而不是放置断点,看看会发生什么!
    • 为我工作。发布了有效的确切代码以及测试场景。
    • 我不想将数据写入磁盘。我希望在保存文档时将数据写入 viewStream...
    猜你喜欢
    • 1970-01-01
    • 2016-02-23
    • 2018-05-18
    • 2016-01-08
    • 1970-01-01
    • 2012-10-11
    • 2010-12-10
    • 1970-01-01
    • 2010-12-28
    相关资源
    最近更新 更多