Unit PrgFuncs; INTERFACE uses HufTypes; function CompareFiles(const File1,File2:string; BufLen:tBufferIndex):boolean; IMPLEMENTATION USES xStrings; function HeapErrorFunc(Size:word):integer; far; begin HeapErrorFunc:=1; end; function CompareFiles; var Buf1,Buf2:tPBuffer; Size1,Size2,Ineq:tBufferIndex; Eq:boolean; OldFileMode:byte; Fl1,Fl2:File; OldHeapErr:pointer; TotalSize:tLargestInt; begin write(' Проверка. Сравнение "',File1,'" и "',File2,'"...'); OldHeapErr:=HeapError; HeapError:=@HeapErrorFunc; GetMem(Buf1,BufLen); GetMem(Buf2,BufLen); HeapError:=OldHeapErr; if (Buf1=NIL) or (Buf2=NIL) then begin Eq:=FALSE; writeln; writeln(^G' ОШИБКА: Недостаточно памяти для буферов.'); end else begin Eq:=TRUE; Assign(Fl1,File1); Assign(Fl2,File2); OldFileMode:=System.FileMode; System.FileMode:=0; {$IfOpt I+} {$Define IOisON} {$I-} {$EndIf} Reset(Fl1,1); if IOResult<>0 then begin {$IfDef IOisON} {$UnDef IOisON} {$I+} {$EndIf} Eq:=FALSE; writeln; writeln(^G' ОШИБКА: Не могу открыть для чтения: ',File1); end; {$IfOpt I+} {$Define IOisON} {$I-} {$EndIf} Reset(Fl2,1); if IOResult<>0 then begin {$IfDef IOisON} {$UnDef IOisON} {$I+} {$EndIf} Eq:=FALSE; writeln; writeln(^G' ОШИБКА: Не могу открыть для чтения: ',File2); end; System.FileMode:=OldFileMode; Size1:=1; TotalSize:=0; while Eq and (Size1>0) do begin BlockRead(Fl1,Buf1^,BufLen,Size1); BlockRead(Fl2,Buf2^,BufLen,Size2); if Size1=Size2 then begin if Size1>0 then Ineq:=FindDifference(Buf1^,Buf2^,Size1); if Ineq<>0 then begin writeln; writeln('Несовпадение на байте номер (нумерация с нуля): ',TotalSize+Ineq); writeln(Buf1^[Ineq], ' : ', Buf2^[Ineq]); Eq:=FALSE; end else begin Inc(TotalSize,Size1); end; end else begin Eq:=FALSE; end; end; Eq:=Eq and (Size1=0); {$IfOpt I+} {$Define IOisON} {$I-} {$EndIf} close(Fl1); close(Fl2); if IOResult<>0 then; {$IfDef IOisON} {$UnDef IOisON} {$I+} {$EndIf} end; if Buf1<>NIL then FreeMem(Buf1,BufLen); if Buf2<>NIL then FreeMem(Buf2,BufLen); CompareFiles:=Eq; writeln(' завершено.'); end; END.