VB.NET将二进制文件读入结构数组

时间:2014-09-01 13:49:16

标签: arrays vb.net structure binaryfiles

我尝试过使用BinaryReader,但这绝对不行。它在第一个读取器上几乎塞满了.Readx位。

所以,我已经改变了方向,并试图使用FILEOPEN,FILEGETOBJECT,FILEPUTOBJECT。

这适用于第一个"记录",但从那时起,我正在

"尝试读取或写入受保护的内存。这通常表明其他内存已损坏"

到目前为止,这是代码:

Dim iFreeFile As Integer = FreeFile()
Dim iFileLength As Integer

' open the file
iFreeFile = FreeFile()
FileOpen(iFreeFile, inFilePath, OpenMode.Binary, OpenAccess.Read, OpenShare.Default)
iFileLength = FileLen(inFilePath)

' This bit reads the data
Dim recordLength As Integer = Marshal.SizeOf(outValue)
Dim myBytes As Byte() : ReDim myBytes(recordLength)

FileGet(iFreeFile, myBytes, inRecordCount)
BuildStr(myBytes, outValue.GetType, outValue)
inRecordCount += 1

outValue是几种结构之一

''' <summary>
''' ' Marshal the Byte Array to the Structure
''' </summary>
''' <param name="Buff">Array of Bytes</param>
''' <param name="MyType">Type of the Structure</param>
''' <param name="outBuffer">Structure Object</param>
Private Sub BuildStr(ByVal Buff() As Byte,
                     ByVal MyType As System.Type,
                     ByRef outBuffer As Object)
    ' Marshal the Byte Array to the Structure

    Dim MyGC As GCHandle = GCHandle.Alloc(Buff, GCHandleType.Pinned)
    'Marshals data from an unmanaged block of memory 
    'to a newly allocated managed object of the specified type.
    outBuffer = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyType) ' <----- here we get the error
End Sub

myBytes数组从FileGet指令加载正常。 outValue传递给ByRef。

可能导致此错误的原因是什么?

我昨晚有一个想法,每次读取记录时我是否必须关闭并重新打开文件?

1 个答案:

答案 0 :(得分:0)

按照降低方法的可能性的降序排列:

选项1 在VB6中编写一个小程序,以更通用的格式写入数据,比如XML。这样就不那么难以在VB.NET中阅读。

选项2 在VB.NET中使用FileGet Function。绝对阅读该文档中的所有注释,并首先回顾VB6代码如何编写数据。如果事实证明FileGet不适用于Option Strict On(我假设您正在使用),那么将读取该文件的类放在单独的类文件中,以便您可以对该一个类使用Option Strict Off。 / p>

选项3 一次读取文件到一个字节数组并解析它。 How Visual Basic 6 Stores Data可能有用 如果 VB6将数据存储到磁盘的方式与将其存储在RAM中的方式相同。


此外,您应该按照以下方式构建文件流和阅读器用法,以确保一切都处理整齐:

Using oFS As New FileStream(filePath, FileMode.Open, FileAccess.Read)
    Using oBR As New BinaryReader(oFS)

    ' reading code goes here

    End Using
End Using

P.S。 Comparitave-&GT;比较