Текущий архив: 2010.08.27;
Скачать: CL | DM;
ВнизTStream Найти похожие ветки
← →
00110011 (2010-02-09 15:44) [0]можно ли напрямую побайтно сравнивать 2 TStream или же только считав (TStream.Read(...)) в буферы сравнивать побайтно в буфере?
← →
Ega23 © (2010-02-09 15:51) [1]Можно
← →
00110011 (2010-02-09 15:55) [2]пример не приведете, а то у меня что-то не получается
← →
Jeer © (2010-02-09 16:08) [3]
> а то у меня что-то не получается
"Дайте воды попить, а то так есть хочется, что переночевать негде"
Такое не слышал ?
← →
Ega23 © (2010-02-09 16:11) [4]
> пример не приведете, а то у меня что-то не получается
Показывай, что не получается.
← →
Jeer © (2010-02-09 16:15) [5]
> сравнивать 2 TStream
Если чего, то TStream - абстрактный класс.
← →
00110011 (2010-02-09 16:28) [6]пишу процедуру сравнения двух файлов: пока что сделал так:
S1 := TFileStream.Create("File1", fmOpenRead or fmShareDenyNone);
S2 := TFileStream.Create("File2", fmOpenRead or fmShareDenyNone);
try
GetMem(B1, S1.Size);
GetMem(B2, S2.Size);
try
if S1.Size > 0 then
begin
S1.Position := 0;
S1.Read(B1^, S1.Size);
end;
if S2.Size > 0 then
begin
S2.Position := 0;
S2.Read(B2^, S2.Size);
end;
for I := 0 to S1.Size - 1 do
if B1[I] <> B2[I] then
begin
ShowMessage(Format("[%d]: B1 = %s; B2 = %s", [I, B1[I], B2[I]]));
Break;
end;
finally
if B1 <> nil then
FreeMem(B1);
if B2 <> nil then
FreeMem(B2);
end;
finally
S1.Free;
S2.Free;
end;
как обойтись без буферов? что-то типа if S1[I] = S2[I] then
← →
Ega23 © (2010-02-09 16:33) [7]
> пишу процедуру сравнения двух файлов: пока что сделал так:
Какой ужас...
Считай CRC32 от обоих и сравнивай его.
← →
grammar-nazi (2010-02-09 16:36) [8]>Ega23 © (09.02.10 16:33) [7]
>> пишу процедуру сравнения двух файлов: пока что сделал так:
> Какой ужас...
> Считай CRC32 от обоих и сравнивай его.
э-э-э... и что это даст? одинаковое значение crc32 никак не означает того, что данные одинаковы.
← →
Ega23 © (2010-02-09 16:44) [9]
> э-э-э... и что это даст? одинаковое значение crc32 никак
> не означает того, что данные одинаковы.
Ну если тебе недостаточно CRC32, то сначала сравни размер обоих, потом сравнивай блоками, по 4 байта. Нафига весь файл-то в память грузить?
← →
00110011 (2010-02-09 17:07) [10]переделал:
procedure TForm8.Button1Click(Sender: TObject);
var
S1, S2: TStream;
I: Integer;
Val1, Val2: Byte;
begin
S1 := TFileStream.Create("File1", fmOpenRead or fmShareDenyNone);
S2 := TFileStream.Create("File2", fmOpenRead or fmShareDenyNone);
try
if S1.Size <> S2.Size then
Exit;
for I := 0 to S1.Size - 1 do
begin
S1.Position := I;
S1.Read(PByte(@Val1)^, SizeOf(Val1));
S2.Position := I;
S2.Read(PByte(@Val2)^, SizeOf(Val2));
if Val1 <> Val2 then
begin
ShowMessage(Format("[%d]: B1 = %s; B2 = %s", [I, Val1, Val2]));
Break;
end;
end;
finally
S1.Free;
S2.Free;
end;
end;
Как вам этом вариант. Более грамотный?
← →
Jeer © (2010-02-09 17:14) [11]
> grammar-nazi (09.02.10 16:36) [8]
> э-э-э... и что это даст? одинаковое значение crc32 никак
> не означает того, что данные одинаковы.
С очень большой вероятность означает, что файлы одинаковы.
← →
Демо © (2010-02-09 17:17) [12]Лучше всё-таки более приличными блоками памяти сравнивать используя, например, функцию CompareMem.
← →
Демо © (2010-02-09 17:21) [13]Можно также для подобных целей (произвольное позиционирование для побайтовой обработки TFileStream) обёртку написать навроде такой:
TFileBuffer=class
private
FS: TFileStream;
FBuffer: String;
FStartBuffer: Int64;
FCurrLenBuffer: Integer;
FEndBuffer: int64;
function GetChar(Index: Int64): Char;
function GetSize: Int64;
procedure SetPosition(const Value: int64);
function GetPosition: Int64;
public
constructor Create(const FilePath: String);
destructor Destroy; override;
property Buffer[Index: Int64]: Char read GetChar; default;
property FileSize: Int64 read GetSize;
property Position: Int64 read GetPosition;
end;{ TFileBuffer }
constructor TFileBuffer.Create(const FilePath: String);
begin
FS := TFileStream.Create(FilePath,fmOpenRead or fmShareDenyWrite);
SetLength(FBuffer,BufLen);
FEndBuffer := -1;
end;
destructor TFileBuffer.Destroy;
begin
if Assigned(FS) then FreeAndNil(FS);
inherited;
end;
function TFileBuffer.GetChar(Index: Int64): Char;
begin
Result := #0;
if (Index<0) or (Index>FS.Size) then Exit;
if (Index>=FStartBuffer) and (Index<=FEndBuffer) then
begin
Result := FBuffer[Index-FStartBuffer+1];
Exit;
end;
FS.Position := (Index div BufLen) * BufLen;
FStartBuffer := FS.Position;
FCurrLenBuffer := FS.Read(FBuffer[1],BufLen);
FEndBuffer := FStartBuffer+FCurrLenBuffer;
Result := FBuffer[Index-FStartBuffer+1];
end;
function TFileBuffer.GetPosition: Int64;
begin
Result := FS.Position;
end;
function TFileBuffer.GetSize: Int64;
begin
Result := FS.Size;
end;
procedure TFileBuffer.SetPosition(const Value: int64);
begin
if (Value>=0) and (Value<FS.Size) then FS.Position := Value;
end;
-)
← →
Демо © (2010-02-09 17:22) [14]Здесь BufLen определить размером 4096 и т п. - в зависимости от задачи...
← →
12 © (2010-02-09 17:33) [15]и так, и >> CompareMem
все равно побайтно/пословно сравнит
← →
Leonid Troyanovsky © (2010-02-09 18:22) [16]
> 00110011 (09.02.10 16:28) [6]
http://delphimaster.net/view/2-1187943014
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-02-09 18:24) [17]
> Ega23 © (09.02.10 16:33) [7]
> Считай CRC32 от обоих и сравнивай его.
Для двух быстрей не будет, бо прочитать,
в худшем случае, придется до конца оба.
--
Regards, LVT.
← →
Leonid Troyanovsky © (2010-02-09 18:52) [18]
> Leonid Troyanovsky © (09.02.10 18:24) [17]
> в худшем случае, придется до конца оба.
В "худшем случае" лишнее, sorry.
--
Regards, LVT.
Страницы: 1 вся ветка
Текущий архив: 2010.08.27;
Скачать: CL | DM;
Память: 0.49 MB
Время: 0.09 c