2012-03-27 6 views
5

Ho bisogno di leggere i dati da un file di database legacy prodotto da Visual Basic 6. Dal software legacy ho scoperto che il file è stato scritto utilizzando Put e passare una sorta di record come parametri alla funzione Put. Queste strutture sono definiti come segue:Lettura (con Filesystem.FileGet) File di registrazione VB6 (scritto con Put) con 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 

Il genere sono più grandi e più complessi, ma ho messo in THE_TYPE le diverse definizioni che ho nel mio progetto. Ho scoperto che importare Microsoft.VisualBasic mi dà accesso alle funzioni VB simili a quelle usate per scrivere il file, quindi sto aprendo e chiudendo il file con FileSystem.OpenFile() e .CloseFile(); ora ho bisogno di leggere finalmente dati contenuti e dal momento che la funzione originale era:

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

Suppongo che posso usare qualcosa di simile, come Microsoft.VisualBasic.FileSystem.FileGet(). Quindi la domanda è, come posso definire un contenitore, suppongo una classe, simile al VB6 originale Tipo "THE_TYPE"? Come chiamo .FileGet() per riempire correttamente questo oggetto?

+0

Mentre GSerg potrebbe averti indicato nella giusta direzione, sappi che ci sono grandi differenze nel modo in cui 'Put' funziona tra le modalità' Apri' di 'Random' e' Binary'. Vedere http://msdn.microsoft.com/en-us/library/aa266212(v=VS.60).aspx e http://msdn.microsoft.com/en-us/library/aa266177(v=vs. 60) .aspx per i dettagli. Ne parlo perché se i membri 'String' e array sono tutti di dimensione fissa, mi chiedevo se l'app VB6 usasse la modalità' Open ... Binary'. – rskar

+0

Era in modalità casuale – ccalboni

+1

+1 per importare 'Microsoft.VisualBasic' e usando' FileSystem'. Saresti stupito [come] (http://stackoverflow.com/questions/7290976/vb6-how-are-binary-files-encoded-using-put-statement) [spesso] (http://stackoverflow.com/questions/8886096/converting-quick-basic-to-vb-net-random-access-files) le persone si affacciano su quelle! – MarkJ

risposta

6

La chiave sta definendo correttamente gli attributi nella dichiarazione della struttura in VB.NET. A condizione che la struttura venga sempre inizializzata da FileGet, non è necessario inizializzare manualmente i suoi campi fissi in un costruttore, altrimenti lo si fa.

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, le matrici dovranno cominciare da zero, quindi i limiti superiori vengono spostati verso il basso.

la lettura dal file:

Dim d As System.ValueType = New THE_TYPE() 

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

234 è la dimensione della struttura in VB6. È più grande in VB.NET, quindi lo vuoi hardcode.

+0

Questo è esattamente quello che stavo cercando, grazie! – ccalboni

+0

+1. Non ho provato questo, e il 234 hardcoding potrebbe essere più sicuro, ma "Marshal.Sizeof" restituirà la corretta dimensione della struttura? – MarkJ

+0

@MarkJ No, in questo caso restituisce lo stesso valore di 'Len', che è 244. Ciò è probabilmente dovuto al fatto che' Char' è due byte in .net. – GSerg