Memorystream içerisindeki dosyanın versiyonu

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

İyi çalışmalar.
Bir memorystream içerisinde tuttuğum exe dosyanın versiyon numarasını diske yazdırmadan nasıl alabilirim.
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

Arkadaşlar ben halen bir çözüm bulamadım maalesef. Çözüm yolunu bilen arkadaşlar varsa yardım bekliyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen mrmarman »

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.
Resim
Resim ....Resim
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

Bakıyorum hocam.Çözersem cevabı yazarım buraya.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen mrmarman »

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. :idea:

- 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.

:alkis: Başarılar.

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;
Kullanımı :

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;
Resim
Resim ....Resim
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

Hocam bu vakit darlığında çok işime yaradı bu kod. İzmir'e uğrarsanız yemek borçluyum size.Teşekkürler.
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

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. :duvar:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen mrmarman »

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
@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.
demişsin.

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;
Kullanımı :

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;
Resim
Resim ....Resim
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

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?
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen mrmarman »

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.
Resim
Resim ....Resim
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

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;

Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

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ı :D ) Yani açıkçası bana balık vermek yerine birazcık avlamayı öğretirseniz daha iyi olacak gibi. Koddan pek bişey anlayamadım. :oops:
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen mrmarman »

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. :roll:
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ı :D ) Yani açıkçası bana balık vermek yerine birazcık avlamayı öğretirseniz daha iyi olacak gibi. Koddan pek bişey anlayamadım. :oops:
Resim
Resim ....Resim
Kullanıcı avatarı
comfort
Üye
Mesajlar: 214
Kayıt: 28 Ara 2004 06:37
Konum: İzmir
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen comfort »

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.

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;
Arkadaşlar çok kullanışlı ve güzel bir kod bence hemen kütüphanelerinize ekleyin lazım olabilir.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Re: Memorystream içerisindeki dosyanın versiyonu

Mesaj gönderen mrmarman »

Uzatmayım, başarılar dilerim. :idea:
Resim
Resim ....Resim
Cevapla