{ По-байтное сравнение двух файлов } {--------------------------------------------------------------------------- (c) Copyright Aleksandrov O.E., 2006 Molecular Physics department, USTU, Ekaterinsburg, K-2, 620002, RUSSIA phone 375-41-46 E-mail: aleks@dpt.ustu.ru (c) Copyright Александров О.Е., 2006 620002, Екатеринбург, К-2, УГТУ, Кафедра молекулярной физики тел. 375-41-46 E-mail: aleks@dpt.ustu.ru ----------------------------------------------------------------------------} Unit CompareFile; INTERFACE // uses ComTypes; const { Максимальная длина обрабатываемого буфера } { ¦ръёшьры№эр  фышэр юсЁрсрЄvтрхьюую сєЇхЁр } cMaxBufferLength={$IfDef Delphi} (High(integer) div 2) {$Else} (High(word)-16){$EndIf} div SizeOf(byte); type { Номер порции данных в буфере } { =юьхЁ яюЁЎшш фрээvї т сєЇхЁх } tBufferIndex=0..cMaxBufferLength; { Буфер для сжатия данных } { +єЇхЁ фы  ёцрЄш  фрээvї } tBuffer=array[tBufferIndex] of byte; tPBuffer=^tBuffer; tINT={$IfNDef Delphi}longint{$ELSE}int64{$EndIf}; 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(' Проверка. Сравнение "'),Ansi2Dos(File1),Ansi2Dos('" и "'),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' ОШИБКА: Не могу открыть для чтения: '),Ansi2Dos(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' ОШИБКА: Не могу открыть для чтения: '),Ansi2Dos(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 writeln(Ansi2Dos('Несовпадение размеров файлов:'),Size1); 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(Ansi2Dos(' завершено.')); end; END.