2012-03-27 55 views
5

我需要從由Visual Basic 6 生產從傳統的軟件,舊的數據庫文件中讀取數據,我發現文件被寫入使用put和將各種記錄作爲參數傳遞給Put函數。這些結構的定義如下:閱讀(帶Filesystem.FileGet)VB6記錄文件(放置了寫的)用C#

Type THE_TYPE 
    FIELD_1 As Single 
    FIELD_2 As String * 20 
    FIELD_3(1 To 50) As Single 
    FIELD_4(1 To 10) As String * 1 
End Type 

我的類型有更大和更復雜的,但我已經把THE_TYPE不同的定義我已經在我的項目。我發現導入Microsoft.VisualBasic使我可以訪問類似於用於寫入文件的VB函數,所以我用FileSystem.OpenFile()和.CloseFile()打開和關閉文件。現在我需要終於看完包含的數據,並且由於最初的功能是:

Public RecordContent As THE_TYPE 
[...] 
Get #1, recordNumber, RecordContent 

我想我可以使用類似的東西,像Microsoft.VisualBasic.FileSystem.FileGet()。 所以問題是,我如何定義一個容器,我想是一個類,類似於原始VB6類型「THE_TYPE」?我如何調用.FileGet()來正確填充此對象?

+0

雖然GSerg可能會指出你在正確的方向,知道有在路上'Put'工作的'Random'和'Binary'的'Open'模式之間的差異很大。見http://msdn.microsoft.com/en-us/library/aa266212(v=VS.60).aspx和http://msdn.microsoft.com/en-us/library/aa266177(v=vs。 60).aspx的細節。我提出這個問題,因爲如果'String'和數組成員都是固定大小,我想知道VB6應用程序是否使用了'Open ... Binary'模式。 – rskar 2012-03-27 13:44:32

+0

這是在隨機模式 – ccalboni 2012-03-27 13:55:10

+1

+1對於導入'Microsoft.VisualBasic'和使用'FileSystem'。你會驚訝[怎麼](http://stackoverflow.com/questions/7290976/vb6-how-are-binary-files-encoded-using-put-statement)[經常](http://stackoverflow.com/questions/8886096 /轉換 - 快速基本到vb-net-random-access-files)的人忽略了這些! – MarkJ 2012-03-27 19:02:09

回答

6

的關鍵是正確地定義屬性在VB.NET結構聲明。假設結構將始終由FileGet初始化,那麼您不需要在構造函數中手動初始化其固定字段,否則您就可以。

Structure THE_TYPE 
    Public FIELD_1 As Single 
    <VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> Public FIELD_2 As String 
    <VBFixedArray(49)> Public FIELD_3 As Single() 
    <VBFixedArray(9)> Public FIELD_4 As Char() 
End Structure 

顯然,數組必須從零開始,所以上邊界向下移動。

從文件中讀取:

Dim d As System.ValueType = New THE_TYPE() 

FileOpen(1, "...", OpenMode.Random, OpenAccess.Read, OpenShare.Default, 234) 
FileGet(1, d, 1) 
FileClose(1) 

234是在VB6的結構的尺寸。它在VB.NET中更大,所以你想要硬編碼。

+0

這就是我一直在尋找的,謝謝! – ccalboni 2012-03-27 13:51:11

+0

+1。我沒有測試過這個,硬編碼234可能是最安全的,但是Marshal.Sizeof會返回正確的結構尺寸嗎? – MarkJ 2012-03-27 19:03:35

+0

@MarkJ不,在這種情況下,它返回與'Len'相同的值,即244。這可能是因爲'.net'是.net中的兩個字節。 – GSerg 2012-03-27 19:05:56