Главная страница
    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.49 MB
Время: 0.09 c
3-1243316202
Naruto
2009-05-26 09:36
2010.08.27
UPDATE в SQLite


15-1269551843
boa_kaa
2010-03-26 00:17
2010.08.27
Броузеры: очередное соревнование


15-1263720611
TUser
2010-01-17 12:30
2010.08.27
Книги (самовывоз)


2-1270481004
Fantasy
2010-04-05 19:23
2010.08.27
Shortcut на рабочем столе. Проблема с функцией GetDir(0,sPath);


2-1270035677
Валигози2
2010-03-31 15:41
2010.08.27
Способ задания порядка записей





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский