function CompareFile(const FilePathA, FilePathB: AnsiString): Boolean;
Var
H1, H2, M1, M2, Size: Longword;
P1, P2: Pointer;
begin
P1 := nil;
P2 := nil;
M1 := 0;
M2 := 0;
H1 := INVALID_HANDLE_VALUE;
H2 := INVALID_HANDLE_VALUE;
Result := False;
try
H1 := CreateFile(PAnsiChar(FilePathA), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if H1 <> INVALID_HANDLE_VALUE then
begin
H2 := CreateFile(PAnsiChar(FilePathB), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_SEQUENTIAL_SCAN, 0);
if H2 <> INVALID_HANDLE_VALUE then
begin
Size := GetFileSize(H1, nil);
if Size <> GetFileSize(H2, nil) then Exit;
if Size = 0 then
begin
Result := True;
Exit;
end;
M1 := CreateFileMapping(H1, nil, PAGE_READONLY, 0, 0, nil);
if M1 <> 0 then
begin
M2 := CreateFileMapping(H2, nil, PAGE_READONLY, 0, 0, nil);
if M2 <> 0 then
begin
P1 := MapViewOfFile(M1, FILE_MAP_READ, 0, 0, 0);
if P1 <> nil then
begin
P2 := MapViewOfFile(M2, FILE_MAP_READ, 0, 0, 0);
if P2 <> nil then Result := CompareMem(P1, P2, Size);
end;
end;
end;
end;
end;
finally
if P2 <> nil then UnmapViewOfFile(P2);
if P1 <> nil then UnmapViewOfFile(P1);
if M2 <> 0 then CloseHandle(M2);
if M1 <> 0 then CloseHandle(M1);
if H2 <> INVALID_HANDLE_VALUE then CloseHandle(H2);
if H1 <> INVALID_HANDLE_VALUE then CloseHandle(H1);
end;
end;