Запись на HD больших файлов [РЕШЕНО]

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Re: Запись на HD больших файлов

Сообщение Alex2013 » 24.06.2023 21:48:57

Владимир писал(а):Laz 2.2.4, FPC 3.

Я спрашивал о том в какой код программа компилируется то есть в 32-х разрядный или в 64-х разрядный.
( Версия достаточно свежая и это хорошо но основной параметр дающий резко различные результаты это разрядность получаемого на выходе кода)
Alex2013
долгожитель
 
Сообщения: 2957
Зарегистрирован: 03.04.2013 11:59:44

Re: Запись на HD больших файлов

Сообщение xchgeaxeax » 24.06.2023 23:22:19

Alex2013 писал(а):Еще одна возможная причина:
BlockRead и BlockWrite это легаси функции так что возможно что их просто никто не проверял на работу с большими файлами в современных ОС. Так что попробуй работать через TFileSteam
Простейший способ.

А вы во внутренности посмотрите
Код: Выделить всё
Procedure BlockRead(var f:File;var Buf;Count:Int64;var Result:Int64);[IOCheck];
{
  Read Count records from file f ro Buf, return number of read records in
  Result
}
Begin
  Result:=0;
  If InOutRes <> 0 then
   exit;
  case FileRec(f).Mode of
    fmInOut,fmInput :
      Result:=Do_Read(FileRec(f).Handle,@Buf,count*FileRec(f).RecSize)
        div FileRec(f).RecSize;
    fmOutput: inOutRes := 104;
    else InOutRes:=103;
  end;
End;
BlockRead -> Do_Read
Код: Выделить всё
Function Do_Read(Handle:thandle;Addr:Pointer;Len:Longint):Longint;

var j:cint;

Begin
  repeat
    Do_Read:=Fpread(Handle,addr,len);
    j:=geterrno;
  until (do_read<>-1) or ((j<>ESysEINTR) and (j<>ESysEAgain));
  If Do_Read<0 Then
   Begin
    Errno2InOutRes;
    Do_Read:=0;
   End
  else
   InOutRes:=0;
End;
Do_Read -> Fpread
Код: Выделить всё
function Fpread(fd: cint; buf: pchar; nbytes : size_t): ssize_t; [public, alias : 'FPC_SYSC_READ'];
{ const
  syscall_nr_read                                = 0; // SYS_READ системный вызов Linux X64 }
begin
  Fpread:=do_syscall(syscall_nr_read,Fd,TSysParam(buf),nbytes);
end;
И после трёх вложенных вызовов мы попадаем ...
... мы попадаем ...
на системный вызов. Куда уж более прямой способ работы с файлами.

2 Владимир. Странно, что у вас запись в файлы обрывается. Вообще функции используют напрямую системные вызовы. Возможно на ФС куда вы пишите файл установлены квоты. Хотя, если их не настраивать, то ничего такого обычно не бывает. Вообще надо разбираться конкретнее. С каким кодом ошибки завершается цикл чтения-записи?
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Запись на HD больших файлов

Сообщение Владимир » 24.06.2023 23:29:40

Alex2013 писал(а):Я спрашивал о том в какой код программа компилируется то есть в 32-х разрядный или в 64-х разрядный.

64 разряда
НО новый поворот: исходный код работает - взял другую флешку 8Гб - полет нормальный.
Догадался выполнить dd на битой флешке, получил ошибку как раз на 4,2 Гб. Не очень понятно в этом смысле сообщение Лазаруса Disc FULL,
Выполнил dd на исправной флешке, получил файл 7,7 Gb 7,2 Gib (вывод dd) или 7386 Гб, моя функция дала файл 7205 Гб.
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Re: Запись на HD больших файлов

Сообщение xchgeaxeax » 24.06.2023 23:46:46

Странно. Проверил у себя работу BlockRead / BlockWrite. У меня Calculate Linux 5.15 на реальной машине

Screenshot_20230624_223720.png


Screenshot_20230624_223823.png


Надо посмотреть как она будет работать с флешкой. Но её сейчас нету под рукой, а в системе только один диск.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
xchgeaxeax
новенький
 
Сообщения: 90
Зарегистрирован: 11.05.2023 03:51:40

Re: Запись на HD больших файлов

Сообщение Владимир » 25.06.2023 09:43:43

[quote="xchgeaxeax"]Странно. Проверил у себя работу BlockRead / BlockWrite. У меня Calculate Linux 5.15 на реальной машине
Насчет разного размера файлов dd и нашей функции: все правильно.
Вставили флешку, прочитали-записали. Затем сравнили размеры полученного файла и /dev/sdb - получили разницу, т.к. система сама подмонтировала флешку и ее размер изменился.
ВСЕМ СПАСИБО!!!
Владимир
постоялец
 
Сообщения: 355
Зарегистрирован: 23.08.2007 19:48:39
Откуда: Москва

Пред.

Вернуться в Lazarus

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 112

Рейтинг@Mail.ru