代码之家  ›  专栏  ›  技术社区  ›  bendecko

内存映射文件vbVerticalTab和vbNullChars将出现在结果中

  •  0
  • bendecko  · 技术社区  · 6 年前

    我尝试使用内存映射文件(MMF)在应用程序之间存储和传输数据。

    这是我的代码:

    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            createMMF()
            readMMF()
        End Sub
    
        Sub createMMF()
            Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 5)
            Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
    
            Dim writer As BinaryWriter = New BinaryWriter(stream)
            writer.Write("hello there")
        End Sub
        Sub readMMF()
    
            Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
            Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
    
            Dim streamReader = New StreamReader(stream)
            Dim text = streamReader.ReadToEnd()
    
            Debug.Print(text)
    
        End Sub
    
    End Class
    

    一些问题:

    1) 在CreateNew调用中,我指定“5”作为大小,但是当我将.write调用从“hello”更改为“hello there”时,没有任何区别。

    2) 当我在接收函数中读取流时,字符串就在那里,但是它在开始时包含了一个奇怪的字符(在调试器上下文中被解码为vbVerticalTab),随后还有大量的vbnullchar。

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  1
  •   bendecko    6 年前

    好吧,多亏了你的评论,我才得以让这个工作起来。这是用于使用二进制编写器/读取器的代码。

       Sub createMMF()
            Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 11)
            Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
    
            Dim writer As BinaryWriter = New BinaryWriter(stream)
            writer.Write("hello there")
    
        End Sub
        Sub readMMF()
    
            Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
            Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
    
            Dim binaryReader = New BinaryReader(stream)
            Dim length = binaryReader.Read()  'gives 11, length of "hello there" string.
            Dim text = binaryReader.ReadChars(length)
    
            Debug.Print(text)
    
        End Sub
    

    另外,我使用StreamReader/Writer对进行了测试。我不得不在writer中使用一个.flush()调用,ReadToEnd方法仍然有很多空字符填充。

     Sub createMMF()
            Dim mmf As MemoryMappedFile = MemoryMappedFile.CreateNew("testmap", 11)
            Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
    
            Dim writer As StreamWriter = New StreamWriter(stream)
            writer.Write("hello there")
            writer.Flush()
    
        End Sub
        Sub readMMF()
    
            Dim mmf As MemoryMappedFile = MemoryMappedFile.OpenExisting("testmap")
            Dim stream As MemoryMappedViewStream = mmf.CreateViewStream()
    
            Dim streamReader = New StreamReader(stream)
            Dim text = streamReader.ReadToEnd()
            Debug.Print(text)
    
        End Sub
    

    检查结果可以看到vbNull字符。

    enter image description here

    推荐文章