Чтение большого двоичного файла из VB6 / VBA / VBScript - PullRequest
0 голосов
/ 24 мая 2018

Я пытаюсь заставить старое приложение VB6 читать большой (больше 2 ГБ) двоичный файл.Я объявляю буфер как:

Dim TCBuffer as String
TCPBuffer = String(4096, Chr(0))

И считываю данные в цикле, используя:

Get #FileNum, , TCPBuffer

Но как только текущая позиция достигает 2 ГБ, строка выше вызывает ошибку.

Ошибка времени выполнения '63':

Неверный номер записи

Так что я подумал о том, чтобы использовать Scripting.FileSystemObject вместо этого.Однако, похоже, этот объект очень ограничен.Во-первых, кажется, что вы можете только создавать и открывать текстовые файлы.

Есть предложения о том, как я могу прочитать большой двоичный файл из VB6?

ОБНОВЛЕНИЕ:

Если подумать еще об этом, другой вариант - использовать функции API.Но одно из реальных ограничений VB6 здесь - отсутствие типов данных без знака.Так что даже использование API-функций было бы уловкой.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Я закончил тем, что создал класс файлов, который использует Windows API внутренне.

Любая функция, которая принимает или возвращает размер файла или смещение, имеет тип Double.Небольшой код преобразует это значение в длинную строку без знака, даже если она передается в API в подписанном Long (потому что VB6 / VBA не поддерживает длинные строки без знака).

0 голосов
/ 24 мая 2018

Лучше всего, вероятно, использовать Windows API для отображения файла в памяти, используя функции CreateFile, CreateFileMapping и MapViewOfFile.Обратитесь к документации Microsoft " Создание объекта сопоставления файлов " для получения дополнительной информации о том, как работает API, хотя, очевидно, вам необходимо перевести специфику в VB.Я немного поискал и обнаружил некоторые старые статьи, все еще около с некоторыми указателями, и архив примера кода из журнала программиста Visual Basic (см. «Постоянство памяти» (июль 1996 г.)"), так что вы не единственный человек, который должен сделать это, и это, кажется, устоявшаяся техника.Имейте в виду, что для файла такого большого размера в 32-разрядном процессе вам необходимо отобразить только часть файла за раз в ваше адресное пространство.

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