内存映射文件长度

Posted

技术标签:

【中文标题】内存映射文件长度【英文标题】:Memory Mapped File Length 【发布时间】:2012-03-07 07:42:09 【问题描述】:

我正在处理内存映射文件。有没有办法知道内存映射文件内容的长度?我想要的是附加现有的内存映射文件。在文件中附加字节很容易,但我正在寻找附加字符串。

我们可以检查 CAPACITY 属性,但它返回我认为的字节大小。

为了更清楚,我正在解释这个场景。我正在创建内存映射文件 A。我在创建它时写了“Hello”。它工作正常。现在我想将“世界”写入现有文件 A。

我为此使用以下代码:

 var file = MemoryMappedFile.OpenExisting("myFile");
            string str = "String to append";
            using (var view = file.CreateViewAccessor())
            
                using (var stream = file.CreateViewStream())
                
                    System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
                    writer.Write(str.ToArray(), INT SIZE,Convert.ToInt32(view.Capacity), str.Length);//Error
                
            
            using (var stream = file.CreateViewStream())
            
                Console.WriteLine("Reading appended File");
                System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
                Console.WriteLine(reader.ReadString());
                Console.WriteLine(string.Empty);
            

我已经用 (//) 标记了要求大小的行。我想知道 (INT SIZE) 的值 任何帮助将不胜感激。

[编辑]我使用的是 C#,Visual Studio 2010。

现在我正在使用此代码追加:

var file = MemoryMappedFile.OpenExisting("myFile");
            string str = "String to append";
            string str1 = string.Empty;


            using (var stream = file.CreateViewStream())
            
                System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);

                str1 = reader.ReadString();
                str1 = str1 + "\n" + str;

                System.IO.BinaryWriter writer = new System.IO.BinaryWriter(stream);
                writer.Write(str1);
            
            using (var stream = file.CreateViewStream())
            
                Console.WriteLine("Reading appended File");
                System.IO.BinaryReader reader = new System.IO.BinaryReader(stream);
                Console.WriteLine(reader.ReadString());
                Console.WriteLine(string.Empty);
            

但它没有附加任何东西。你能检查我的代码吗?

【问题讨论】:

【参考方案1】:

您不能通过在其后写入更多字符来附加到流中的字符串,因为这不会改变已写入的字符串的长度。

此外,BinaryWriter 没有任何方法可以让您像这样写入流中的特定位置。对于采用字符数组和两个整数的重载,第二个参数指定数组中的位置,而不是流中的位置。

如果要更改写入流中的字符串,则必须从流中读取字符串并用新字符串重写流。

【讨论】:

感谢您的回复。你能重新检查我的问题吗?我试过了,我从你的回答中了解到。但它不起作用。 @Deepak:您必须在写入流之前重置或重新打开流,否则您将继续从上次停止读取的位置写入,因此原始字符串仍然是流中的第一个字符串。 你好 Guffa,我有一个问题。请问可以在这里回复吗?还是我应该问一下? 如果你能看到这个问题***.com/questions/9631778/… @MohamedSakherSawan:内存映射文件的长度与容量相同。如果您将文件作为内存映射文件打开,则它是文件的长度。如果您创建一个新的内存映射文件,您可以自己指定容量。

以上是关于内存映射文件长度的主要内容,如果未能解决你的问题,请参考以下文章

Linux 内核 内存管理内存映射原理 ② ( 内存映射概念 | 文件映射 | 匿名映射 | 内存映射原理 | 分配虚拟内存页 | 产生缺页异常 | 分配物理内存页 | 共享内存 | 进程内存 )

内存映射文件

内存映射大文件

高效率场景-内存映射

内存映射文件原理探索

内存映射文件原理探索