Unit PrgFuncs; INTERFACE // uses ComTypes; function CompareFiles(const File1,File2:string; BufLen:tBufferIndex):boolean; IMPLEMENTATION USES xStrings, UMiscFun; function CompareFiles; var Buf1,Buf2:tPBuffer; Size1,Size2:integer; Ineq:tBufferIndex; Eq:boolean; OldFileMode:byte; Fl1,Fl2:File; TotalSize:tInt; begin write(Ansi2Dos(' Проверка. Сравнение "'),File1,Ansi2Dos('" и "'),File2,'"...'); Buf1:=NIL; Buf2:=NIL; try GetMem(Buf1,BufLen); GetMem(Buf2,BufLen); except if Assigned(Buf1) then FreeMem(Buf1,BufLen); if Assigned(Buf2) then FreeMem(Buf2,BufLen); buf1:=NIL; buf2:=NIL; end; if (Buf1=NIL) or (Buf2=NIL) then begin Eq:=FALSE; writeln; writeln(Ansi2Dos(^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(Ansi2Dos(^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(Ansi2Dos(^G' ОШИБКА: Не могу открыть для чтения: '),File2); end; System.FileMode:=OldFileMode; Size1:=1; TotalSize:=0; Ineq:=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 Dec(Ineq); writeln; writeln(Ansi2Dos('Несовпадение на байте номер (нумерация с нуля): '),TotalSize+Ineq); if (Ineq>Low(Ineq)) then write(Buf1^[Pred(Ineq)], ' : ', Buf2^[Pred(Ineq)],', '); write(Buf1^[Ineq], ' : ', Buf2^[Ineq]); if (Ineq0 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(Ansi2Dos(' завершено.')); end; END.