Как сравнить два файла
Иногда возникает необходимость сравнения файлов, причем сравнение по размеру
необходимо, но недостаточно. В таком случае остается лишь побайтовое сравнение файлов.
uses
Classes, Windows;
function AreFilesEqual(const FileName1, FileName2: String): Boolean;
const
BUFFER_SIZE = 4096;
var
FileStream1, FileStream2: TFileStream;
Buffer1, Buffer2: AnsiString;
BufferSize, BufferReadSize1, BufferReadSize2: Integer;
begin
try
FileStream1 := TFileStream.Create(FileName1, fmOpenRead);
try
FileStream2 := TFileStream.Create(FileName2, fmOpenRead);
Result := FileStream1.Size = FileStream2.Size;
if Result then
try
SetLength(Buffer1, BUFFER_SIZE);
SetLength(Buffer2, BUFFER_SIZE);
BufferSize := BUFFER_SIZE * SizeOf(AnsiChar);
ZeroMemory(PAnsiChar(Buffer1), BufferSize);
ZeroMemory(PAnsiChar(Buffer2), BufferSize);
repeat
BufferReadSize1 := FileStream1.Read(Buffer1[1], BufferSize);
BufferReadSize2 := FileStream2.Read(Buffer2[1], BufferSize);
Result := Result and (BufferReadSize1 = BufferReadSize2) and (Buffer1 = Buffer2);
until not Result or (BufferReadSize1 <> BufferSize);
finally
FileStream2.Free;
end;
finally
FileStream1.Free;
end;
except
Result := False;
end;
end;
|
Для сравнительно небольших файлов можно использовать другой способ. Его основное
отличие состоит в том, что файлы целиком считываются в память. Так как это
осуществляется за одно обращение к файловой системе, метод работает значительно
быстрее, но только на небольших файлах. На больших файлах он начинает отставать по
быстродействию, а на очень больших он просто рухнет. Но тут уже вам выбирать, какой
способ подходит больше.
uses
Classes, Windows;
function CompareFiles(const FileName1, FileName2: String): Boolean;
var
File1Content, File2Content: TMemoryStream;
File1Size, File2Size: Cardinal;
File1Handle, File2Handle: THandle;
begin
Result := False;
File1Handle := CreateFile(PAnsiChar(FileName1), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
try
File2Handle := CreateFile(PAnsiChar(FileName2), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
try
if (File1Handle <> INVALID_HANDLE_VALUE) and (File2Handle <> INVALID_HANDLE_VALUE) then
begin
Result := GetFileSize(File1Size, nil) = GetFileSize(File2Size, nil);
if Result then
begin
File1Content := TMemoryStream.Create;
try
File2Content := TMemoryStream.Create;
try
File1Content.LoadFromFile(FileName1);
File2Content.LoadFromFile(FileName2);
Result := CompareMem(File1Content.Memory, File2Content.Memory, File1Content.Size);
finally
File2Content.Free;
end;
finally
File1Content.Free;
end;
end;
end;
finally
CloseHandle(File2Handle);
end;
finally
CloseHandle(File1Handle);
end;
end;
|
Смотрите также:
|