Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.064 c
2-1268377125
Oleksiy
2010-03-12 09:58
2010.08.27
Размер Шрифта


2-1269157663
Alexandr_I
2010-03-21 10:47
2010.08.27
помогите новичку разобраться с ооп


15-1269450731
GDI+
2010-03-24 20:12
2010.08.27
Формула рассчета расстояния между двумя точками на сфероиде


2-1269455858
plazmaser
2010-03-24 21:37
2010.08.27
строки в ексель


2-1273483795
Sandiesel
2010-05-10 13:29
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский