2012-03-27 16 views
5

Ich muss Daten aus einer Legacy-Datenbankdatei von Visual Basic 6 lesen. Von der Legacy-Software fand ich, dass die Datei mit Put und geschrieben wurde Übergeben einer Art von Datensätzen als Parameter an die Put-Funktion. Diese Strukturen sind wie folgt definiert:Lesen (mit Filesystem.FileGet) VB6-Datensatzdatei (geschrieben mit Put) mit 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 

Meine Typen sind größer und komplexer, aber ich habe in THE_TYPE die verschiedenen Definitionen habe ich in meinem Projekt. Ich habe gefunden, dass das Importieren von Microsoft.VisualBasic mir Zugang zu VB-Funktionen gibt, die jenen ähnlich sind, die verwendet werden, um die Datei zu schreiben, also öffne und schließe ich die Datei mit FileSystem.OpenFile() und .CloseFile(); Jetzt muss ich schließlich Daten enthalten sind, und da die ursprüngliche Funktion lesen war:

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

Ich glaube, ich etwas ähnliches, wie Microsoft.VisualBasic.FileSystem.FileGet() verwenden können. Die Frage ist also, wie definiere ich einen Container, nehme ich eine Klasse an, die dem ursprünglichen VB6-Typ "THE_TYPE" ähnelt? Wie rufe ich .FileGet() auf, um dieses Objekt korrekt zu füllen?

+0

Während GSerg Ihnen vielleicht in die richtige Richtung gezeigt hat, wissen Sie, dass es große Unterschiede in der Art und Weise gibt, wie 'Put' zwischen den' Offenen' Modi von 'Random' und' Binary' funktioniert. Siehe http://msdn.microsoft.com/en-us/library/aa266212(v=VS.60).aspx und http://msdn.microsoft.com/en-us/library/aa266177(v=vs. 60) .aspx für Details. Ich bringe das auf, denn wenn die "String" - und Array-Elemente alle eine feste Größe haben, habe ich mich gefragt, ob die VB6-App den "Open ... Binary" -Modus verwendet. – rskar

+0

Es war im Random-Modus – ccalboni

+1

+1 Für den Import von 'Microsoft.VisualBasic' und die Verwendung von' FileSystem'. Sie wären erstaunt [wie] (http://stackoverflow.com/questions/7290976/vb6-how-are-binary-files-encoded-using-put-statement) [oft] (http://stackoverflow.com)/questions/8886096/converting-quick-basic-zu-vb-net-random-access-files) Leute übersehen diese! – MarkJ

Antwort

6

Der Schlüssel ist die korrekte Definition von Attributen in der Strukturdeklaration in VB.NET. Vorausgesetzt, die Struktur wird immer von FileGet initialisiert, müssen Sie ihre festen Felder in einem Konstruktor nicht manuell initialisieren, sonst tun Sie das.

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 

obviosuly, werden die Arrays von Null beginnen, so dass die oberen Grenzen werden nach unten verschoben.

Lesen aus der Datei:

Dim d As System.ValueType = New THE_TYPE() 

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

234 die Größe der Struktur in VB6 ist. Es ist größer in VB.NET, also wollen Sie das fest codieren.

+0

Genau das habe ich gesucht, danke! – ccalboni

+0

+1. Ich habe das nicht getestet, und Hardcoding 234 könnte am sichersten sein, aber würde Marshal.Sizeof die richtige Strukturgröße zurückgeben? – MarkJ

+0

@MarkJ Nein, in diesem Fall gibt es dasselbe wie 'Len', was 244 ist. Dies ist wahrscheinlich, weil' Char' zwei Byte in .net ist. – GSerg