ıdftp ile Exe çalışırken güncelleme

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

ıdftp ile Exe çalışırken güncelleme

Mesaj gönderen haydarxxx »

viewtopic.php?t=19095&highlight=idftp

linkinde mrmarman hocamın verdiği ıdftp kodlarını denedim çok güzel hazırlanmış burada şunu sormak istiyorum ftp ile inen exe dosyası eski exe dosysı ile nasıl yer değiştirilebilir yani eskisi silinecek yeni exe yüklenecek runtime (program çalışırken) de

Kod: Tümünü seç

HedefDosya  := ExtractFilePath(Application.Exename) +KaynakDosya;
  If FileExists(HedefDosya) AND ( MessageDlg('Hedef Dosya Mevcut, üzerine yazılsın mı ? '+#13'('+HedefDosya+')', mtInformation, [mbYes, mbCancel], 0) = mrCancel )
   then EXIT
   else DeleteFile(HedefDosya);
  If FTPDosyaAl( IdFtp, KaynakDosya, HedefDosya, FTPAdres, KaynakDizin, Name, Pass ) then
    MessageDlg('Dosya Başarıyla Alındı'+#13'('+HedefDosya+')', mtInformation, [mbok], 0)
         else
    MessageDlg('Dosya Alınamadı'+#13'('+KaynakDosya+')', mtError, [mbok], 0);


de

Kod: Tümünü seç

'Dosya Başarıyla Alındı'
denildikten sonra ne yazılıyor yeni exe ile eskisinin değişmesi için yada bu anlamda güncelleme yöntem metodu nedir. program çalışırken silinmesi çok saçma ama :? .Teşekkürler
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Bunun IdFtp ile alakası yok. Exe çalışırken silemezsin. Bunun için harici küçük bir uygulama yapmalısın. Update işlemine başlar başlamaz Programınızı kapatan ve update uygulamasını çalıştıran kodlar devreye girmeli. Update programı bu arada IdFtp ile dosyayı indirir ve ismi de exeden farklı olur.. Ve programın tam olarak kapanıp kapanmadığını kontrol eder. Bunun için sürekli olarak başarılı olana kadar DeleteFile uygulayabilirsiniz. Yani bir döngü olacak. Exe silindikten sonra, indirmiş olduğun ve ismi değişik olan dosyanın ismini silinmiş olan exe'nin ismi ile aynı yap. Ve böylece her şey arkaplanda halledilir. Kullanıcı da exe çalışırken silineceğini zannedecek.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Bunun için harici küçük bir uygulama yapmalısın. Update işlemine başlar başlamaz Programınızı kapatan ve update uygulamasını çalıştıran kodlar devreye girmeli. Update programı bu arada IdFtp ile dosyayı indirir ve ismi de exeden farklı olur.. Ve programın tam olarak kapanıp kapanmadığını kontrol eder. Bunun için sürekli olarak başarılı olana kadar DeleteFile uygulayabilirsiniz. Yani bir döngü olacak. Exe silindikten sonra, indirmiş olduğun ve ismi değişik olan dosyanın ismini silinmiş olan exe'nin ismi ile aynı yap
hocam harici küçük bir program yaparız ftp deki dosyam örneğin Kursgüncel.exe olsun .Projemdeki exe ise Kurs.exe olsun.Harici programdan dosyayı indirdikten sonra nasıl bir kod ile Kurs.exe yi sildirip yerine Kursgüncel.exe yi (ftp den inen) Kurs.exe olarak değiştirteceğiz. ]
Exe silindikten sonra, indirmiş olduğun ve ismi değişik olan dosyanın ismini silinmiş olan exe'nin ismi ile aynı yap
exe Dosyanın tam indiğinden nasıl emin olcağız.
Yani bir döngü olacak
örnek verebilirseniz memnun olurum
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Ftp ile doğru bir şekilde inip inmediğini kontrol edebilmen için ancak dosya boyutunu karşılaştırarak öğrenebilrsin. Ki ftp'den dosya boyutunu öğrenme noktasında bir çok sorun da çıkmıyor değil. Çünkü her ne kadar IdFtp desteklese de bazen server dosya boyutunda sorun çıkarabiliyor. Bunun yerine dosyanın hash'ini de ftp'de dosya ile birlikte verirsin. Bu hash dosyası md5 olabilir sfv olabilir, ya da başka bir hash tekniği ile şifrelenmiş bir dosya olabilir. Bunun boyutu kb cinsindendir ve boyutu önemsizdir. Exe ile beraber bunu da ftp'den indirtirsin. Sonra bu hash ile indridiğin exe dosyasının hash bilgisini karşılaştırırsın. Sonuç eğer eşit ise dosya doğru düzgün inmiştir. Dosyanın hash'ini nasıl yapacağından sonra bahsedelim.
Dosya doğru bir şekilde indi. Şimdi yapman gereken çalışan programı kapatmak. Ya da indrimeye başladğın sırada da kapatabilirsin. Bu sana kalmış. Forumda ya da başka bir yerde başka bir uygulamayı kapatmanın nasıl olduğunu araştırabilirsin. En basit olarak

Kod: Tümünü seç

Handle := FindWindow('TAnaForm', nil);
PostMessage(Handle, WM_QUIT, 0, 0);
while (Handle <> 0) and (freeze < 1000000) do
begin
   Inc(freeze);
   Handle := FindWindow('TAnaForm', nil);
   Application.ProcessMessages;
end;
gibi bir şey deneyebilrsin.
Her neyse, program kapanmaya başladı. Normalde bir programın çalışıp çalışmadığını anlaman için belli apiler var. Ama tavsiye etmem. Çünkü program işlemi aktif işlem listesinden silinse bile yarım saniye veya yavaş bilgisayarlarda daha fazla süre ek işlem gerekebiliyor. Bu yüzden exe üzerindeki kilit hemen kalkmıyor. Bu yüzden,

Kod: Tümünü seç

while not DeleteFile(OrginalFile) do
   Application.ProcessMessages;
RenameFile(UpdateFile, OrginalFile);
gibi bir şey yapman gerek. Bundan sonra WinExec ile programını tekrar çalıştırabilirisin.

Kolay gelsin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

Hoca işler çok karıştı :? Beni maruz görün

Kod: Tümünü seç

Bunun için harici küçük bir uygulama yapmalısın
bir program yaptım (güncelle.exe) bu programa erişmek için

Ana projede güncelle butonu var diyelim (Stok.exe) butonun click olayına
shellapi ile güncelle.exe programını çalıştırdım ve sonrada close; diyerek ana programı kapattırdım.Ana progra kapalı ama güncelleme yapacak olan program açıldı

güncelle.exe çalışıyor burdaki butonada ftp den dosyayı indirtme işi yaptırdım (inen dosya Stokgüncel.exe)

şimdi işlem bittiğinde c:\Stoktakip altında
güncelle.exe //harici küçük uygulama
Stok.exe //ana programın exe si
Stokgüncel.exe //ftpden inen

güncelle.exe deki ftp ile dosya indikten sonra
'Dosya Başarıyla Alındı' dedikten sonra nasıl bir şey ekleniyor ki Stok.exe silinsin Stokgüncel.exe ise Stok.exe olarak adı değiştirilsin.İlginiz için teşekkürler
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Selam..

- Programın kendi kendini silip yeni halini çalıştırmak için kendi uyguladığım yöntemi bildireyim. Kendi kendini kopya korumalı yapan bir örneğim vardı onda kullanmıştım.

- yazılımın ile aynı isimde ancak uzantıs BAK olan dosyanın indirilmesini sağladıktan sonra aşağıdaki işlemi yaptır.

- Program önce BAT.BAT isimli bir yığın (batch) dosyası oluşturacak ve kendi kendini kapatıp bu BAT dosyasını çalıştıracak.

- Program kapandıktan sonra bu bat dosyası işleme girecek ve içeriğinde kapattığın kendi programın silinecek ve BAK uzantılı olan yeni dosyan EXE olarak kopyalanacak veya dilersen rename ile ismi değiştirilecek. Ardından bu yeni EXE çalıştırılacak.

- EXE dosyanın OnCreate olayında ise aşağıdaki kod daha önce BAT dosyaının yaptığı benzer görevi devralacak ve BAT dosyası varsa onu yok edecek...

// OnCreate olayındakiler...

Kod: Tümünü seç

  If FileExists(ExtractFilePath(Application.Exename) +'BAT.BAT') then
    DeleteFile(ExtractFilePath(Application.Exename) +'BAT.BAT');
// Güncelleme işlemi yapacak BAT hazırlığı, programdan çıkış ve BAT çalıştırma.

Kod: Tümünü seç

        Bat := TStringList.Create;
        Bat.Add('@Echo Off' );
        Bat.Add( Format('Copy %s %s', [ChangeFileExt(Application.ExeName,'.BAK'), Application.ExeName]) );
        Bat.Add('DEL '+ChangeFileExt(Application.ExeName,'.BAK'));
        Bat.Add( Application.ExeName );
        Bat.SaveToFile( ExtractFilePath(Application.Exename)+'Bat.BAT' );
        Bat.Free;
        Application.Terminate;
        WinExec( PChar( ExtractFilePath(Application.Exename)+'Bat.BAT'), SW_Hide );
Resim
Resim ....Resim
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

haydarxxx yazdı:nasıl bir şey ekleniyor ki Stok.exe silinsin Stokgüncel.exe ise Stok.exe olarak adı değiştirilsin.İlginiz için teşekkürler
Gönderdiğim mesajda bir while döngüsü vermiştim. Onun ile silip indrdiğin dosyayı onunla yer değiştirebilirsin. Bir daha okursan cevabı orada bulacağına eminim.

Kolay gelsin.
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

mrmarman hocam ilginiz için teşekkür ediyorum.
Programın kendi kendini silip yeni halini çalıştırmak için kendi uyguladığım yöntemi bildireyim
Bu yazdıklarınız ana projemden yaparak (ek küçük bir progaram yazmadan) direk kendi projemde
yazılımın ile aynı isimde ancak uzantıs BAK olan dosyanın indirilmesini sağladıktan sonra aşağıdaki işlemi yaptır.
ben Stoktakip.exe mi Stoktakip.BAK şeklinde bir kopyasını değiştirerek hosta gönderdim sonra bunu indirdim verdiğiniz ftp kodları ile indirmesini sağlayabiliyorum.

Kod: Tümünü seç

procedure TForm2.FormCreate(Sender: TObject);
begin
    If FileExists(ExtractFilePath(Application.Exename) +'Stoktakip.BAT') then
    DeleteFile(ExtractFilePath(Application.Exename) +'Stoktakip.BAT');

end;
yazdım

güncelle butonuma

Kod: Tümünü seç

procedure TForm2.Button11Click(Sender: TObject);
Var
  FTPAdres,
  KaynakDizin,
  Name,
  Pass,
  KaynakDosya,
  HedefDosya      : String;
begin
  FTPAdres    := 'kubilayilkogretim.k12.tr';
  KaynakDizin := '\programlar';
  Name        := 'kubilay';
  Pass        :=  'kaby20687';
  KaynakDosya := 'Stoktakip.BAK';
  HedefDosya  := ExtractFilePath(Application.Exename) +KaynakDosya;

  If FileExists(HedefDosya) AND ( MessageDlg('Hedef Dosya Mevcut, üzerine yazılsın mı ? '+#13'('+HedefDosya+')', mtInformation, [mbYes, mbCancel], 0) = mrCancel )
   then EXIT
   else DeleteFile(HedefDosya);

  If FTPDosyaAl( IdFtp, KaynakDosya, HedefDosya, FTPAdres, KaynakDizin, Name, Pass ) then
  MessageDlg('Dosya Başarıyla Alındı'+#13'('+HedefDosya+')', mtInformation, [mbok], 0)

    else MessageDlg('Dosya Alınamadı'+#13'('+KaynakDosya+')', mtError, [mbok], 0);
end;
indikten sonra
// Güncelleme işlemi yapacak BAT hazırlığı, programdan çıkış ve BAT çalıştırma.

Kod: Tümünü seç

MessageDlg('Dosya Başarıyla Alındı'+#13'('+HedefDosya+')', mtInformation, [mbok], 
Bat := TStringList.Create ;
        Bat.Add('@Echo Off' );
        Bat.Add( Format('Copy %s %s', [ChangeFileExt(Application.ExeName,'.BAT'), Application.ExeName]) );
        Bat.Add('DEL '+ChangeFileExt(Application.ExeName,'.BAK'));
        Bat.Add( Application.ExeName );
        Bat.SaveToFile( ExtractFilePath(Application.Exename)+'Stoktakip.BAT' );
        Bat.Free;
        Application.Terminate;
        WinExec( PChar( ExtractFilePath(Application.Exename)+'Stoktakip.BAT'), SW_Hide );
ekeldikten sonra

Kod: Tümünü seç

Bat := TStringList.Create ;
bu satırla ilgili hata alıyorum

Kod: Tümünü seç

Undeclared identifier:'Bat'
Missing operator or semicolon
yardılarınızı umuyorum.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

:lol: :cry:


- BAT ile BAK'ları karıştırmışsın. Verdiğim koda sadık kalmayı dene...

- Button1'in VAR bloğuna bu değişkeni tanımlamayı ihmal etmişsiniz.

Kod: Tümünü seç

Var
  Bat : TStringList; 

- Değişken tanımlamadan yapmak istersen şöyle de yapabilirsin. (seninkine göre düzeltilmiş hali)

Kod: Tümünü seç

  With TStringList.Create do begin
    Add('@Echo Off' );
    Add( Format('Copy %s %s', [ChangeFileExt(Application.ExeName,'.BAK'), Application.ExeName]) );
    Add('DEL '+ChangeFileExt(Application.ExeName,'.BAK'));
    Add( Application.ExeName );
    SaveToFile( ExtractFilePath(Application.Exename)+'Stoktakip.BAT' );
    Free;
  end;
  Application.Terminate;
  WinExec( PChar( ExtractFilePath(Application.Exename)+'Stoktakip.BAT'), SW_Hide );
Resim
Resim ....Resim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

hocam bu ne hızlılık böyle (forum farkı vallahi :D )

Kod: Tümünü seç

Var
  FTPAdres,
  KaynakDizin,
  Name,
  Pass,
  KaynakDosya,
  HedefDosya      : String;
 Bat := TStringList.Create ;
begin
  FTPAdres    := 'kubilayilkogretim.k12.tr';
  KaynakDizin := '\programlar';
  Name        := 'kubilay';
  Pass        :=  'kbads01';
  KaynakDosya := 'Stoktakip.exe';
  HedefDosya  := ExtractFilePath(Application.Exename) +KaynakDosya;

  If FileExists(HedefDosya) AND ( MessageDlg('Hedef Dosya Mevcut, üzerine yazılsın mı ? '+#13'('+HedefDosya+')', mtInformation, [mbYes, mbCancel], 0) = mrCancel )
   then EXIT
   else DeleteFile(HedefDosya);

  If FTPDosyaAl( IdFtp, KaynakDosya, HedefDosya, FTPAdres, KaynakDizin, Name, Pass ) then
  MessageDlg('Dosya Başarıyla Alındı'+#13'('+HedefDosya+')', mtInformation, [mbok], 0)

        Bat.Add('@Echo Off' );
        Bat.Add( Format('Copy %s %s', [ChangeFileExt(Application.ExeName,'.BAT'), Application.ExeName]) );
        Bat.Add('DEL '+ChangeFileExt(Application.ExeName,'.BAK'));
        Bat.Add( Application.ExeName );
        Bat.SaveToFile( ExtractFilePath(Application.Exename)+'Stoktakip.BAT' );
        Bat.Free;
        Application.Terminate;
        WinExec( PChar( ExtractFilePath(Application.Exename)+'Stoktakip.BAT'), SW_Hide );
    else MessageDlg('Dosya Alınamadı'+#13'('+KaynakDosya+')', mtError, [mbok], 0);
end;
var blokuna da ekledim Bat := TStringList.Create ; satırnda hata alıyorum (denemiştim) ama
En son haydarxxx tarafından 25 Eyl 2007 03:36 tarihinde düzenlendi, toplamda 1 kere düzenlendi.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Sen de mesajı hemen okumuşsun. Diğer hatanı sonradan gördüm onu düzeltmek için mesajı edit etmiştim göremdin sanırım...
@mrmarman'ın bir önceki mesajında [b]Edit[/b] ettiği kod yazdı:- Değişken tanımlamadan yapmak istersen şöyle de yapabilirsin. (seninkine göre düzeltilmiş hali)

Kod: Tümünü seç

  With TStringList.Create do begin 
    Add('@Echo Off' ); 
    Add( Format('Copy %s %s', [ChangeFileExt(Application.ExeName,'.BAK'), Application.ExeName]) ); 
    Add('DEL '+ChangeFileExt(Application.ExeName,'.BAK')); 
    Add( Application.ExeName ); 
    SaveToFile( ExtractFilePath(Application.Exename)+'Stoktakip.BAT' ); 
    Free; 
  end; 
  Application.Terminate; 
  WinExec( PChar( ExtractFilePath(Application.Exename)+'Stoktakip.BAT'), SW_Hide );
Resim
Resim ....Resim
Kullanıcı avatarı
haydarxxx
Üye
Mesajlar: 668
Kayıt: 09 May 2005 11:31
Konum: izmir

Mesaj gönderen haydarxxx »

mrmarman hocam Süpersiniz

Hocam ne diyeyim Allah sizden razı olsun tam istediğim gibi oldu elinize yüreğinize sabrınıza sağlık.Çok teşekkürler
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Bu işlemi içeren bir örnek hazırlyıp Makaleler kısmına koydum.. Dileyen deneyebilir.

bkz. viewtopic.php?p=120664#120664
Resim
Resim ....Resim
Cevapla