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
Владимир. Странно, что у вас запись в файлы обрывается. Вообще функции используют напрямую системные вызовы. Возможно на ФС куда вы пишите файл установлены квоты. Хотя, если их не настраивать, то ничего такого обычно не бывает. Вообще надо разбираться конкретнее. С каким кодом ошибки завершается цикл чтения-записи?