Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.51 MB
Время: 0.075 c
15-1272540136
atruhin
2010-04-29 15:22
2010.08.27
Простая библиотека чтения dbf


15-1272627412
12
2010-04-30 15:36
2010.08.27
EDBEngineError. Cannot load driver. Что можно сделать?


15-1265624198
Сергей М.
2010-02-08 13:16
2010.08.27
TMozillaBrowser и программный доступ к параметрам конфигурации


15-1270055427
Юрий Зотов
2010-03-31 21:10
2010.08.27
Ну почему именно на этом сайте процветают хамство и грубость?


9-1187679377
wsaenotsock
2007-08-21 10:56
2010.08.27
проблема SetDisplayMode