Memorystream içerisindeki dosyanın versiyonu
Forum kuralları
Forum kurallarını okuyup, uyunuz!
Forum kurallarını okuyup, uyunuz!
Memorystream içerisindeki dosyanın versiyonu
İyi çalışmalar.
Bir memorystream içerisinde tuttuğum exe dosyanın versiyon numarasını diske yazdırmadan nasıl alabilirim.
Bir memorystream içerisinde tuttuğum exe dosyanın versiyon numarasını diske yazdırmadan nasıl alabilirim.
Re: Memorystream içerisindeki dosyanın versiyonu
Arkadaşlar ben halen bir çözüm bulamadım maalesef. Çözüm yolunu bilen arkadaşlar varsa yardım bekliyorum.
Re: Memorystream içerisindeki dosyanın versiyonu
Version bilgisi dosyanın sonunda RESOURCE olarak saklanır. Bu kısma odaklanıp tek tek bu bilgi bloğu çekilebilmektedir. VS_VERSION_INFO ile başlayan kısmı bulursan, adım adım ilerleyip tüm version bilginisi çekebilirsin. MemoryStream de bir tür FileStream olduğuna göre bu uygulamanın rahatlıkla üstesinden gelirsin.
Re: Memorystream içerisindeki dosyanın versiyonu
Bakıyorum hocam.Çözersem cevabı yazarım buraya.
Re: Memorystream içerisindeki dosyanın versiyonu
Merhaba.
- Konumuz, bir exe dosyanın Sürüm Bilgisini ( Version Information ) API kullanmadan dosya içinden ( TMemoryStream kullandık, TFilestream ile de olurdu ama buradaki konu TMemoryStream içindeki bir dosyadır ) binary olarak bilgiyi arayıp bulmak ve okumak.
- Boş vaktimde biraz çalıştım. Şahsen kendi adıma güzel bir beyin jimnastiği oldu.
- Aşağıda çözüm fonksiyonu bulunuyor. Function için parametre olarak dosya adını verdiğinde, bu dosyanın dinamik olarak oluşturulan TMemoryStrem'e atılması ve aranması şeklinde örnekledim. Sen kendi fonksiyonunu tasarlarken parametre olarak dosya adı değil de direkt dosyanın içinde bulunduğu MemoryStream'i alacak şekilde dönüştürebilirsin.
Başarılar.
Kullanımı :

- Konumuz, bir exe dosyanın Sürüm Bilgisini ( Version Information ) API kullanmadan dosya içinden ( TMemoryStream kullandık, TFilestream ile de olurdu ama buradaki konu TMemoryStream içindeki bir dosyadır ) binary olarak bilgiyi arayıp bulmak ve okumak.
- Boş vaktimde biraz çalıştım. Şahsen kendi adıma güzel bir beyin jimnastiği oldu.

- Aşağıda çözüm fonksiyonu bulunuyor. Function için parametre olarak dosya adını verdiğinde, bu dosyanın dinamik olarak oluşturulan TMemoryStrem'e atılması ve aranması şeklinde örnekledim. Sen kendi fonksiyonunu tasarlarken parametre olarak dosya adı değil de direkt dosyanın içinde bulunduğu MemoryStream'i alacak şekilde dönüştürebilirsin.

Kod: Tümünü seç
Type tVer = Array[00..20] of Byte; // 21 byte
Function VersiyonBilgisi( DosyaAdi : TFileName ): String;
// tVer ile belirttiğimiz iki set Byte verinin eşit olup olmadığını kontrol
Function Esit( Set1, Set2 : tVer ):boolean;
var
i : Integer;
begin
Result := SizeOf(Set1) = SizeOf(Set2);
i := 0;
while ( i < SizeOf(set1) ) AND Result do begin
if set1[i] <> set2[i] then Result := False;
inc(i);
end;
end;
Var
Aranan1,
Aranan2,
Surum : String;
i : Integer;
Konum : dWord;
Bulundu : Boolean;
Ara : tVer;
FileAra : tVer;
Okunan : tVer;
xMemoryStream : TMemoryStream;
begin
xMemoryStream := TMemoryStream.Create;
xMemoryStream.LoadFromFile(DosyaAdi);
xMemoryStream.Seek( 0, soFromBeginning );
Aranan1 := 'VS_VERSION_'; // Aslında VS_VERSION_INFO ama bu kadarı yeterli.
Aranan2 := 'FileVersion'; // iki yerine kısa aranan kadarlık bir değişken yeterli.
// Her karakterin arasına $0 ekliyoruz. Byte olarak ararken lazım.
Ara[0] := Ord(Aranan1[1]);
For i := 0 to SizeOf(Ara)-1 do begin
if ((i mod 2) = 1 ) then Ara[i] := $0
else Ara[i] := Ord(Aranan1[(i div 2)+1]);
end;
// Her karakterin arasına $0 ekliyoruz. Byte olarak ararken lazım.
FileAra[0] := Ord(Aranan2[1]);
For i := 0 to SizeOf(Ara)-1 do begin
if ((i mod 2) = 1 ) then FileAra[i] := $0
else FileAra[i] := Ord(Aranan2[(i div 2)+1]);
end;
// Aramaya başlıyoruz.
Bulundu := False;
Konum := 0;
// Byte Byte ardışık olarak 21 byte okuyup, elimizdeki ile karşılaştırıyoruz.
// Herhangi bir anda bulunursa hemen döngü sona erecek.
while (Konum < xMemoryStream.Size) AND (NOT Bulundu) do begin
xMemoryStream.Seek(Konum, soFromBeginning);
xMemoryStream.Read( Okunan, SizeOf(Okunan) );
if Esit(Okunan, Ara) then Bulundu := True
else Inc(Konum);
Application.ProcessMessages;
end;
// Arama sonucu olumlu ise bloğa girer sürüm bilgisi okuruz.
if Bulundu then begin
Bulundu := False;
while (Konum < xMemoryStream.Size) AND (NOT Bulundu) do begin
xMemoryStream.Seek( Konum, soFromBeginning );
xMemoryStream.Read( Okunan, SizeOf(Okunan) );
if Esit(Okunan, FileAra) then
begin
// Sonraki okunacak olan kısımda sürüm numarası var.
xMemoryStream.Read( Okunan, SizeOf(Okunan) );
Surum := '';
for i := 0 to SizeOf(Okunan)-1
do if Ord(Okunan[i]) > 20
then Result := Result + CHR(Ord(Okunan[i]));
Bulundu := True;
end else Inc(Konum);
Application.ProcessMessages;
end;
end else Result := '';
xMemoryStream.Free;
end;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
Var
Surum : String;
begin
Surum := VersiyonBilgisi( Application.Exename );
if Surum = '' then MessageDlg('Sürüm bilgisi bulunamadı !!', mtError, [mbOk], 0)
else ShowMessage( 'Dosya Sürümü : ' + Surum);
end;
Re: Memorystream içerisindeki dosyanın versiyonu
Hocam bu vakit darlığında çok işime yaradı bu kod. İzmir'e uğrarsanız yemek borçluyum size.Teşekkürler.
Re: Memorystream içerisindeki dosyanın versiyonu
hocam parametre olarak gönderdiğim memorystream 'i daha sonra free edemiyorum. Access violation hatası veriyor. free edemediğim içinde döngünün içinde olduğumdan dolayı bir sonraki dosyaların versiyon bilgisiyle bitiştiriyor. örnek vereyim 1.dosya 1.0.0.1 2.dosya 1.4.0.432 sonuç 1.0.0.11.4.0.432 şeklinde hepsini ardıardına bitiştiriyor. tabi siz fonksiyonda seek(0,sofrombegining) dediğinizden her defasında başa dönüp versiyonları bitiştiriyor. sonuç olarak bu memorystream'i free etmem gerek. 

Re: Memorystream içerisindeki dosyanın versiyonu
Nasıl free edemiyorum ? Muhtemelen fonksiyon içinde en sonda FREE edilen satırı ayıklamayı unuttuğunuzdan, ikinci defa free etmeye çalışıyor olmalısınız.
EKLEME
Ayrıca
Burada ardışık ekleme diye bişey almaması lazım, bilgi bulunduğu anda döngü biter, yani arama durur ve çıkar.
Düzenlenmiş haldeki kodu veriyorum.
Kullanımı :
EKLEME
Ayrıca
demişsin.@comfort yazdı:örnek vereyim 1.dosya 1.0.0.1 2.dosya 1.4.0.432 sonuç 1.0.0.11.4.0.432 şeklinde hepsini ardıardına bitiştiriyor. tabi siz fonksiyonda seek(0,sofrombegining) dediğinizden her defasında başa dönüp versiyonları bitiştiriyor.
Burada ardışık ekleme diye bişey almaması lazım, bilgi bulunduğu anda döngü biter, yani arama durur ve çıkar.
Düzenlenmiş haldeki kodu veriyorum.
Kod: Tümünü seç
Type tVer = Array[00..20] of Byte; // 21 byte
Function VersiyonBilgisi( xMemoryStream : TMemoryStream ): String;
// tVer ile belirttiğimiz iki set Byte verinin eşit olup olmadığını kontrol
Function Esit( Set1, Set2 : tVer ):boolean;
var
i : Integer;
begin
Result := SizeOf(Set1) = SizeOf(Set2);
i := 0;
while ( i < SizeOf(set1) ) AND Result do begin
if set1[i] <> set2[i] then Result := False;
inc(i);
end;
end;
Var
Aranan1,
Aranan2,
Surum : String;
i : Integer;
Konum : dWord;
Bulundu : Boolean;
Ara : tVer;
FileAra : tVer;
Okunan : tVer;
begin
Aranan1 := 'VS_VERSION_'; // Aslında VS_VERSION_INFO ama bu kadarı yeterli.
Aranan2 := 'FileVersion'; // iki yerine kısa aranan kadarlık bir değişken yeterli.
// Her karakterin arasına $0 ekliyoruz. Byte olarak ararken lazım.
Ara[0] := Ord(Aranan1[1]);
For i := 0 to SizeOf(Ara)-1 do begin
if ((i mod 2) = 1 ) then Ara[i] := $0
else Ara[i] := Ord(Aranan1[(i div 2)+1]);
end;
// Her karakterin arasına $0 ekliyoruz. Byte olarak ararken lazım.
FileAra[0] := Ord(Aranan2[1]);
For i := 0 to SizeOf(Ara)-1 do begin
if ((i mod 2) = 1 ) then FileAra[i] := $0
else FileAra[i] := Ord(Aranan2[(i div 2)+1]);
end;
// Aramaya başlıyoruz.
Bulundu := False;
Konum := 0;
// Byte Byte ardışık olarak 21 byte okuyup, elimizdeki ile karşılaştırıyoruz.
// Herhangi bir anda bulunursa hemen döngü sona erecek.
while (Konum < xMemoryStream.Size) AND (NOT Bulundu) do begin
xMemoryStream.Seek(Konum, soFromBeginning);
xMemoryStream.Read( Okunan, SizeOf(Okunan) );
if Esit(Okunan, Ara) then Bulundu := True
else Inc(Konum);
Application.ProcessMessages;
end;
// Arama sonucu olumlu ise bloğa girer sürüm bilgisi okuruz.
if Bulundu then begin
Bulundu := False;
while (Konum < xMemoryStream.Size) AND (NOT Bulundu) do begin
xMemoryStream.Seek( Konum, soFromBeginning );
xMemoryStream.Read( Okunan, SizeOf(Okunan) );
if Esit(Okunan, FileAra) then
begin
// Sonraki okunacak olan kısımda sürüm numarası var.
xMemoryStream.Read( Okunan, SizeOf(Okunan) );
Surum := '';
for i := 0 to SizeOf(Okunan)-1
do if Ord(Okunan[i]) > 20
then Result := Result + CHR(Ord(Okunan[i]));
Bulundu := True;
end else Inc(Konum);
Application.ProcessMessages;
end;
end else Result := '';
end;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
Var
Surum : String;
xMemoryStream : TMemoryStream;
begin
xMemoryStream := TMemoryStream.Create;
xMemoryStream.LoadFromFile( Application.Exename );
Surum := VersiyonBilgisi( xMemoryStream );
if Surum = '' then MessageDlg('Sürüm bilgisi bulunamadı !!', mtError, [mbOk], 0)
else ShowMessage( 'Dosya Sürümü : ' + Surum);
xMemoryStream.Free;
end;
Re: Memorystream içerisindeki dosyanın versiyonu
hocam sizin fonksiyonun başına result:='' yazınca düzeldi. debug ederken fonsiyona girdiğimde result değişkeninde bir önceki dosyanın versiyon bilgisi duruyordu. yenisini de üzerine ekliyordu.
ne alaka anlamadım. 2 gündür uyumuyorum ondan mı acep?
ne alaka anlamadım. 2 gündür uyumuyorum ondan mı acep?
Re: Memorystream içerisindeki dosyanın versiyonu
Local değişkenlerde (fonksiyon içindeki değişken de local değişkendir) sen ona özel herhangi bir direktif vermezsen ( direktif değşkeni CONST tanımlayıp {$j+} ve {$j-} arasına almaktır. Daha önce örneklemiştim ) eski değer bulunmaz. Bence tüm işlemlerini fonksiyon içinden yaptığın için bu sonuçla karşılaştın.
Sorguladığın kodu buraya yazarsan hatanın nerede olduğunu söyleyebilirim. Sorununa çözüm bulduğun için sevindim.
Sorguladığın kodu buraya yazarsan hatanın nerede olduğunu söyleyebilirim. Sorununa çözüm bulduğun için sevindim.
Re: Memorystream içerisindeki dosyanın versiyonu
buyur hocam benim sorgulama yaptığım kod. outfile değişkeni hedef memorystream. eğer sizin fonsiyonda result='' yapmazsam nasıl oluyorsa içerisi boşalmıyor eskisinide tutuyor.
Kod: Tümünü seç
procedure TAnaForm.ZipleriAc;
var
StrStream: TStringStream;
Count: Integer;
ZipFileMem: TZipFile;
Buffer: array[0..4095] of Byte;
OutFile: TMemoryStream;
I, a: Integer;
sorgu: string;
Modul: TModul;
begin
Application.ProcessMessages;
cxCheckListBox1.Items[3].Checked := True;
sorgu := 'update modul set DATA=:DATA, VERSION=:version where id=:id';
a := 0;
for I := 0 to Length(ZipFileArray) - 1 do
begin
cxGrid1TableView1.DataController.FocusedRowIndex := a;
Inc(a);
ZipFileMem := TZipFile.Create;
Modul := TModul.Create;
ZipFileMem := ZipFileArray[i].ZipFile;
Modul := ZipFileArray[i].Modul;
OutFile := TMemoryStream.Create;
StrStream := TStringStream.Create(ZipFileMem.Data[0]);
repeat
try
Count := strstream.Read(Buffer, SizeOf(Buffer));
if Count <> 0 then
OutFile.WriteBuffer(Buffer, Count);
except
Count := 0;
end;
until Count = 0;
Application.ProcessMessages;
qryScript.Close;
qryScript.SQL.Text := sorgu;
qryScript.Params[0].LoadFromStream(OutFile);
qryScript.Params[1].AsString := VersiyonBilgisi(outfile); //ahanda burası hocam
qryScript.Params[2].AsInteger := Modul.id;
qryScript.ExecQuery;
cxGrid1TableView1.DataController.SetValue(I, 2, '2');
ZipFileMem.Free;
Modul.Free;
outfile.Free;
StrStream.Free;
Application.ProcessMessages;
end;
qry1.Transaction.CommitRetaining;
qryScript.Close;
end;
Re: Memorystream içerisindeki dosyanın versiyonu
hocam bizim exe sürümlerimiz 4 karaktere kadar çıkabiliyor. Fonksiyon her zaman 2 haneyi alıyor. Kodu inceledim kafamda baya bir soru işareti var. Örneğin 21 byte nereden çıktı . Acaba bu sebepten dolayımı eksik bilgi getiriyor. Bendeki dosya versiyonları 1.0.11.1058 gibi olabiliyor. tabi bana dönen sonuç 1.0.11.10 oluyor. Koda müdahele etmeye çalıştım ama bu seferde boş dönüyor. tver tanımlarken [00.20] yerine [00..40] falan denedim olmadı. (kodu spor totoya çevirdim ya tutarsa hesabı
) Yani açıkçası bana balık vermek yerine birazcık avlamayı öğretirseniz daha iyi olacak gibi. Koddan pek bişey anlayamadım. 


Re: Memorystream içerisindeki dosyanın versiyonu
Hocam açık kaynak kod verdim. Biraz olsun kafa yorsak kod kendini açıklıyor zaten.
Neden 21 byte demişsin. Bunun bir DİZİ (array) olduğunu görüyorsun, içine neyi yerleştirmişiz ? "'VS_VERSION_'" karakter dizisini yerleştirmişiz. Yerleştirirken ne yapmışız ? aralarına "$0" karakteri koymuşuz. Bunu neden yapmışız ? EXE dosyanın içine bakarsan, resource içinde aradığın bu kelimenin harflerinin yanyana aynı şekilde DİZİLMEDİĞİ, bunun yerine arlarında $00 ile bulunduğunu göreceksin. Zaten hemen altındaki döngü ne yapmış ? Bu "VS_VERSION_" içerisine şiş kebap yapar gibi bir harf bir $00, bir harf bir $00 dizmiş. Oldu mu sana LENGTH uzunluğu 11 olan karakterin arasına $00 eklenmiş hali toplam 21, işte bu 21 byte ondan dolayı. Bak kodda açık olarak var.
Sonra demişsin ki sana ait version numaraları biraz daha uzun. Sen de uzunluk olarak kendine özel bir boyut belirle, sonra bunu değişken haline getir ve onu öylece okut. Ben değişken tasarrufu sağlamak için elimdeki mevcut 21 byte'lık yapılmışı var hesabı değişken kullandım. Sen de biraz daha geliştir.
Burada sana çok kızdım. "Yani açıkçası bana balık vermek yerine birazcık avlamayı öğretirseniz daha iyi olacak gibi. Koddan pek bişey anlayamadım." demişsin ki pes vallahi diyorum, başka bişey demiyorum. İstediğin olay, seni aşıyorsa ben de buna karşılık hiç bulaşma derim. Gerçekten ayıp ettin.
Neden 21 byte demişsin. Bunun bir DİZİ (array) olduğunu görüyorsun, içine neyi yerleştirmişiz ? "'VS_VERSION_'" karakter dizisini yerleştirmişiz. Yerleştirirken ne yapmışız ? aralarına "$0" karakteri koymuşuz. Bunu neden yapmışız ? EXE dosyanın içine bakarsan, resource içinde aradığın bu kelimenin harflerinin yanyana aynı şekilde DİZİLMEDİĞİ, bunun yerine arlarında $00 ile bulunduğunu göreceksin. Zaten hemen altındaki döngü ne yapmış ? Bu "VS_VERSION_" içerisine şiş kebap yapar gibi bir harf bir $00, bir harf bir $00 dizmiş. Oldu mu sana LENGTH uzunluğu 11 olan karakterin arasına $00 eklenmiş hali toplam 21, işte bu 21 byte ondan dolayı. Bak kodda açık olarak var.
Sonra demişsin ki sana ait version numaraları biraz daha uzun. Sen de uzunluk olarak kendine özel bir boyut belirle, sonra bunu değişken haline getir ve onu öylece okut. Ben değişken tasarrufu sağlamak için elimdeki mevcut 21 byte'lık yapılmışı var hesabı değişken kullandım. Sen de biraz daha geliştir.
Burada sana çok kızdım. "Yani açıkçası bana balık vermek yerine birazcık avlamayı öğretirseniz daha iyi olacak gibi. Koddan pek bişey anlayamadım." demişsin ki pes vallahi diyorum, başka bişey demiyorum. İstediğin olay, seni aşıyorsa ben de buna karşılık hiç bulaşma derim. Gerçekten ayıp ettin.

comfort yazdı:hocam bizim exe sürümlerimiz 4 karaktere kadar çıkabiliyor. Fonksiyon her zaman 2 haneyi alıyor. Kodu inceledim kafamda baya bir soru işareti var. Örneğin 21 byte nereden çıktı . Acaba bu sebepten dolayımı eksik bilgi getiriyor. Bendeki dosya versiyonları 1.0.11.1058 gibi olabiliyor. tabi bana dönen sonuç 1.0.11.10 oluyor. Koda müdahele etmeye çalıştım ama bu seferde boş dönüyor. tver tanımlarken [00.20] yerine [00..40] falan denedim olmadı. (kodu spor totoya çevirdim ya tutarsa hesabı) Yani açıkçası bana balık vermek yerine birazcık avlamayı öğretirseniz daha iyi olacak gibi. Koddan pek bişey anlayamadım.
Re: Memorystream içerisindeki dosyanın versiyonu
Yok hocam yanlış anlamışsınız. Zaten kodu çözdüm ve düzelttim sadece buraya yazma fırsatı bulamadım. Sonra alıncak bişey yok hocam ağır bir lafmı konuştuk. Açıklamanızı istedim sadece. Ayrıca exelerin sürümlerini kendime göre uyarlayamam 10 senelik programlar.
Ben daha 5 senedir yazılım geliştiriyorum ve en az 5 senem daha var sizin gibi olmaya.
Sanırım siniriniz bozuk bir zamanda bu iletiyi okudunuz çünkü tepkiniz çok şaşırtıcı. Gayet kibar ve espritüel bir üslupla kodu açıklamanızı istedim .Sonra ben bu işe bulaşmayım öğrenmeyim de neyapayım. Diğer işsiz güçsüz gençler gibi eşkiyalıkmı yapayım. Siz öğreteceksiniz biz de öğrenicez. Büyüklerimizden bu tip tepkiler almak biz gençlerin hevesini kırıyor.
Neyse ki sayenizde bu işi çözdüm uzatmaya gerek yok. Kodun bana uygun halini aşağıda yazıyorum. Emeğinize tekrar teşekkür ederim yanlış anlaşma için özür dilerim.
Arkadaşlar çok kullanışlı ve güzel bir kod bence hemen kütüphanelerinize ekleyin lazım olabilir.
Ben daha 5 senedir yazılım geliştiriyorum ve en az 5 senem daha var sizin gibi olmaya.
Sanırım siniriniz bozuk bir zamanda bu iletiyi okudunuz çünkü tepkiniz çok şaşırtıcı. Gayet kibar ve espritüel bir üslupla kodu açıklamanızı istedim .Sonra ben bu işe bulaşmayım öğrenmeyim de neyapayım. Diğer işsiz güçsüz gençler gibi eşkiyalıkmı yapayım. Siz öğreteceksiniz biz de öğrenicez. Büyüklerimizden bu tip tepkiler almak biz gençlerin hevesini kırıyor.
Neyse ki sayenizde bu işi çözdüm uzatmaya gerek yok. Kodun bana uygun halini aşağıda yazıyorum. Emeğinize tekrar teşekkür ederim yanlış anlaşma için özür dilerim.
Kod: Tümünü seç
Type
tVer = Array[00..20] of Byte; // 21 byte
tVer2 = Array[0..26] of Byte;
Function VersiyonBilgisi( xMemoryStream : TMemoryStream ): String;
// tVer ile belirttiğimiz iki set Byte verinin eşit olup olmadığını kontrol
Function Esit( Set1, Set2 : tVer ):boolean;
var
i : Integer;
begin
Result := SizeOf(Set1) = SizeOf(Set2);
i := 0;
while ( i < SizeOf(set1) ) AND Result do begin
if set1[i] <> set2[i] then Result := False;
inc(i);
end;
end;
Var
Aranan1,
Aranan2,
Surum : String;
i : Integer;
Konum : dWord;
Bulundu : Boolean;
Ara : tVer;
FileAra : tVer;
Okunan : tVer;
Okunan2 : tVer2;
Text:string;
begin
Aranan1 := 'VS_VERSION_'; // Aslında VS_VERSION_INFO ama bu kadarı yeterli.
Aranan2 := 'FileVersion'; // iki yerine kısa aranan kadarlık bir değişken yeterli.
// Her karakterin arasına $0 ekliyoruz. Byte olarak ararken lazım.
Ara[0] := Ord(Aranan1[1]);
For i := 0 to SizeOf(Ara)-1 do begin
if ((i mod 2) = 1 ) then Ara[i] := $0
else Ara[i] := Ord(Aranan1[(i div 2)+1]);
end;
// Her karakterin arasına $0 ekliyoruz. Byte olarak ararken lazım.
FileAra[0] := Ord(Aranan2[1]);
For i := 0 to SizeOf(Ara)-1 do begin
if ((i mod 2) = 1 ) then FileAra[i] := $0
else FileAra[i] := Ord(Aranan2[(i div 2)+1]);
end;
// Aramaya başlıyoruz.
Bulundu := False;
Konum := 0;
// Byte Byte ardışık olarak 21 byte okuyup, elimizdeki ile karşılaştırıyoruz.
// Herhangi bir anda bulunursa hemen döngü sona erecek.
while (Konum < xMemoryStream.Size) AND (NOT Bulundu) do begin
xMemoryStream.Seek(Konum, soFromBeginning);
xMemoryStream.Read( Okunan, SizeOf(Okunan) );
if Esit(Okunan, Ara) then Bulundu := True
else Inc(Konum);
Application.ProcessMessages;
end;
// Arama sonucu olumlu ise bloğa girer sürüm bilgisi okuruz.
if Bulundu then begin
Bulundu := False;
while (Konum < xMemoryStream.Size) AND (NOT Bulundu) do begin
xMemoryStream.Seek( Konum, soFromBeginning );
xMemoryStream.Read( Okunan, SizeOf(Okunan) );
if Esit(Okunan, FileAra) then
begin
// Sonraki okunacak olan kısımda sürüm numarası var.
xMemoryStream.Read( Okunan2, SizeOf(Okunan2) );
Surum := '';
for i := 0 to SizeOf(Okunan2)-1 do
begin
if (Ord(Okunan2[i]) > 20) and (Ord(Okunan2[i])<>34) then Result := Result + CHR(Ord(Okunan2[i]));
if (Ord(Okunan2[i])=34) then break;
end;
Bulundu := True;
end else Inc(Konum);
Application.ProcessMessages;
end;
end else Result := '';
end;