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);

また、たとえばusingステートメントを使用して、完了したら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;
    }
于 2012-09-10T20:00:25.047 に答える