Последняя версия DataExpress 3 beta от 27 мая 2018 года. Скачать. Энциклопедия DX. Форум на Develop-Soft

Как открыть файл для чтения побайтно?

Все о том как сделать что-то с помощью скриптов.
Zenitchik
Интересующийся
Сообщения: 66
Зарегистрирован: Чт мар 08, 2018 1:07 am

Как открыть файл для чтения побайтно?

Сообщение Zenitchik » Вс мар 11, 2018 6:22 pm

Как в языке RemObject Pascal Script открыть файл для последовательного чтения байт за байтом? Ну или хотя бы блоками заданного размера?
Я хочу вычислять CRC64 файлов и класть их в базу данных. Функция у меня есть. Нужно байт за байтом скармливать ей содержимое файла.
Файл может быть любого типа (картинка, программа, архив, пр), возможно - большого размера (неск. гигабайт), поэтому загружать его в память весь - нерационально (а может быть и невозможно).
Стандартные методы из Pascal - не работают (неизвестный тип file, неизвестный тип text).

Аватара пользователя
admin
Разработчик
Сообщения: 3535
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

Re: Как открыть файл для чтения побайтно?

Сообщение admin » Вс мар 11, 2018 7:35 pm

Используйте потоки Stream, для файлов TFileStream. Это стандартный класс Lazarus/Delphi, в сети есть информация.

Zenitchik
Интересующийся
Сообщения: 66
Зарегистрирован: Чт мар 08, 2018 1:07 am

Re: Как открыть файл для чтения побайтно?

Сообщение Zenitchik » Чт мар 22, 2018 10:38 pm

Код: Выделить всё

function file_crc32(path:WideString):cardinal;
var
  i:integer;
  stream:TFileStream;
  table: array of cardinal;
  buf:string;
  len:Longint;
begin
  table := make_crc32_table();
  msgbox('path', path);
  stream := TFileStream.create(path, fmOpenRead);
  //len := stream.size;

  //stream.Seek(0,soFromBeginning);
  len := stream.Read(buf, 10);
  msgbox('buflen', intToStr(length(buf)));
  msgbox('buf', buf);
  result := 0;
  //result := next_crc32(table, result, buf, len);
  //msgbox('len', intToStr(stream.size));
  result:=cardinal(0);
  stream.Free;
end;   


Устал экспериментировать. Все варианты, которые компилируются, считывают пустую строку,
msgbox('buflen', intToStr(length(buf))); === 0
msgbox('buf', buf); === ''

хотя файл существует, и его размер ( stream.size) я получаю.
Что я делаю не так?

Аватара пользователя
admin
Разработчик
Сообщения: 3535
Зарегистрирован: Пн мар 14, 2016 11:32 am
Откуда: Ленинградская

Re: Как открыть файл для чтения побайтно?

Сообщение admin » Пт мар 23, 2018 6:32 am

Надо выделить память строке. Обычно это делается автоматически, но в этом случае вручную.

Код: Выделить всё

SetLength(str, length);

Zenitchik
Интересующийся
Сообщения: 66
Зарегистрирован: Чт мар 08, 2018 1:07 am

Re: Как открыть файл для чтения побайтно?

Сообщение Zenitchik » Пт мар 23, 2018 1:44 pm

А потом, стало быть, её освободить надо? Какой командой?

jurist23rus
Эксперт
Сообщения: 2165
Зарегистрирован: Пт сен 30, 2016 9:42 am
Откуда: Майкоп

Re: Как открыть файл для чтения побайтно?

Сообщение jurist23rus » Пт мар 23, 2018 2:07 pm

Я не уверен, что память требуется освобождать в данном случае - это же не объект. Но если хотите то

Код: Выделить всё

SetLength(str, 0)
Destiny is a very convenient word for those who never take decisions.


Вернуться в «Общие вопросы.»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость