Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

TStream


00110011 ©   (2010-02-09 15:44:00) 

можно ли напрямую побайтно сравнивать 2 TStream или же только считав (TStream.Read(...)) в буферы сравнивать побайтно в буфере?


Leonid Troyanovsky   (2010-02-09 18:52:00) [1]


> Leonid Troyanovsky ©   (09.02.10 18:24) [17]

> в худшем случае, придется до конца оба.

В "худшем случае" лишнее, sorry.

--
Regards, LVT.


Leonid Troyanovsky   (2010-02-09 18:24:00) [2]


> Ega23 ©   (09.02.10 16:33) [7]

> Считай CRC32 от обоих и сравнивай его.

Для двух быстрей не будет, бо прочитать,
в худшем случае, придется до конца оба.

--
Regards, LVT.


Leonid Troyanovsky   (2010-02-09 18:22:00) [3]


> 00110011   (09.02.10 16:28) [6]

http://delphimaster.net/view/2-1187943014

--
Regards, LVT.


12   (2010-02-09 17:33:00) [4]

и так, и >> CompareMem
все равно побайтно/пословно сравнит


Демо   (2010-02-09 17:22:00) [5]

Здесь BufLen определить размером 4096 и т п. - в зависимости от задачи...


Демо   (2010-02-09 17:21:00) [6]

Можно также для подобных целей (произвольное позиционирование для побайтовой обработки 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:17:00) [7]

Лучше всё-таки более приличными блоками памяти сравнивать используя, например,  функцию CompareMem.


Jeer   (2010-02-09 17:14:00) [8]


> grammar-nazi   (09.02.10 16:36) [8]
> э-э-э... и что это даст? одинаковое значение crc32 никак
> не означает того, что данные одинаковы.


С оченьбольшой вероятность означает, что файлы одинаковы.


00110011   (2010-02-09 17:07:00) [9]

переделал:


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;


Как вам этом вариант. Более грамотный?


Ega23   (2010-02-09 16:44:00) [10]


> э-э-э... и что это даст? одинаковое значение crc32 никак
> не означает того, что данные одинаковы.


Ну если тебе недостаточно CRC32, то сначала сравни размер обоих, потом сравнивай блоками, по 4 байта. Нафига весь файл-то в память грузить?


grammar-nazi   (2010-02-09 16:36:00) [11]

>Ega23 ©   (09.02.10 16:33) [7]
>> пишу процедуру сравнения двух файлов: пока что сделал так:
> Какой ужас...
> Считай CRC32 от обоих и сравнивай его.
э-э-э... и что это даст? одинаковое значение crc32 никак не означает того, что данные одинаковы.


Ega23   (2010-02-09 16:33:00) [12]


> пишу процедуру сравнения двух файлов: пока что сделал так:


Какой ужас...

Считай CRC32 от обоих и сравнивай его.


00110011   (2010-02-09 16:28:00) [13]

пишу процедуру сравнения двух файлов: пока что сделал так:


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


Jeer   (2010-02-09 16:15:00) [14]


> сравнивать 2 TStream


Если чего, то TStream - абстрактный класс.


Ega23   (2010-02-09 16:11:00) [15]


> пример не приведете, а то у меня что-то не получается


Показывай, что не получается.


Jeer   (2010-02-09 16:08:00) [16]


> а то у меня что-то не получается


"Дайте воды попить, а то так есть хочется, что переночевать негде"

Такое не слышал ?


00110011   (2010-02-09 15:55:00) [17]

пример не приведете, а то у меня что-то не получается


Ega23   (2010-02-09 15:51:00) [18]

Можно


Наверх

Титульная страница Поиск, карта сайта Написать письмо