Чтение (с помощью Filesystem.FileGet) файла записи VB6 (написанного с помощью Put) с помощью C # - PullRequest
6 голосов
/ 27 марта 2012

Мне нужно прочитать данные из устаревшего файла базы данных, созданного в Visual Basic 6. Из устаревшего программного обеспечения я обнаружил, что файл был написан с использованием Put и передает сортировку записей в качестве параметров в функцию Put. Эти структуры определены следующим образом:

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 (), чтобы правильно заполнить этот объект?

1 Ответ

6 голосов
/ 27 марта 2012

Ключ правильно определяет атрибуты в объявлении структуры в 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, так что вы хотите жестко закодировать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...