- Formunuza birer tane TIdFTP, TGauge, TStatusBar ve TButton koyun...
- Yapılan işlem kısaca şu : Yazılımınız ile tıpatıp aynı isimdeki bir dosyayı FTP sitesinden download edecek, ardından yazılımınızın kendi kendini kapatılması sağlanarak, siteden indirilen dosya ile yenilenecek ve yeni haliyle tekrar çalışacak şekilde tasarlandı.
- Bilerek bu örnek için 1 MB FTP'de yer ayırdım. Kısa süreliğine açık kalacak daha sonra kapatıcam. İlk denemeler için belki merak eden olur..
- Kaynak kodlarıyla birlikte örnek indirmek isteyenler için link vereyim..
http://rapidshare.com/files/58430354/SelfUpdate.zip
Kod: Tümünü seç
Var
xDosyaUzunluk : LongInt;
function FTPDosyaAl( IdFTP : TIdFTP; SrcDosya, DesDosya:TFileName; Ftp, RemoteDir, Login, Pass : String ):Boolean;
begin // Uses IdFTP, IdFTPCommon
Result := False;
IdFtp.Host := Ftp;
IdFtp.Username := Login;
IdFtp.Password := Pass;
IdFtp.Passive := True;
IdFtp.Connect;
If IdFtp.Connected then
begin
IdFtp.ChangeDir(RemoteDir);
// Gauge'de kullanmak için
// Dosya Uzunluğunu grlobal bir değişkene atıyoruz...
xDosyaUzunluk := IdFtp.Size( SrcDosya );
Try
IdFtp.TransferType := ftBinary; // Uses IdFTPCommon
IdFtp.Get(SrcDosya, DesDosya, True);
Finally
Result := True;
end;
IdFtp.Quit;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
If FileExists(ExtractFilePath(Application.Exename) +'Guncelle.BAT')
then DeleteFile(ExtractFilePath(Application.Exename) +'Guncelle.BAT');
end;
procedure TForm1.Guncelle();
Var
FTPAdres,
KaynakDizin,
Name,
Pass,
KaynakDosya,
HedefDosya : String;
begin
// Bilerek bu örnek için 1 MB yer ayırarak açtığım FTP sunucu adresini veriyorum...
FTPAdres := 'emerkez.info';
KaynakDizin := '/programlar';
Name := 'delphi';
Pass := 'arman';
KaynakDosya := ExtractFileName(Application.Exename);
HedefDosya := ChangeFileExt( ExtractFilePath(Application.Exename) + KaynakDosya, '.BAK' );
HedefDosya := ChangeFileExt( ExtractFilePath(Application.Exename) + KaynakDosya, '.BAK' );
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#13
+ 'Şimdi program yeniden başlatılmak üzere kapatılacaktır....',
mtConfirmation, [mbOk], 0)
else MessageDlg('Dosya Alınamadı'+#13'('+KaynakDosya+')', mtError, [mbok], 0);
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)+'Guncelle.BAT' );
Free;
end;
Application.Terminate;
WinExec( PChar( ExtractFilePath(Application.Exename)+'Guncelle.BAT'), SW_Hide );
end;
procedure TForm1.IdFtpStatus(ASender: TObject; const AStatus: TIdStatus;
const AStatusText: string);
begin
StatusBar1.SimpleText := AStatusText;
end;
procedure TForm1.IdFtpWork(ASender: TObject; AWorkMode: TWorkMode;
AWorkCount: Integer);
begin
Gauge1.Progress := AWorkCount;
Application.ProcessMessages;
end;
procedure TForm1.IdFtpWorkBegin(ASender: TObject; AWorkMode: TWorkMode;
AWorkCountMax: Integer);
begin
Gauge1.MinValue := 0;
Gauge1.MaxValue := xDosyaUzunluk;
Gauge1.Progress := 0;
Gauge1.Visible := True;
end;
procedure TForm1.IdFtpWorkEnd(ASender: TObject; AWorkMode: TWorkMode);
begin
Gauge1.Progress := 0;
Gauge1.Visible := False;
end;
Kod: Tümünü seç
procedure TForm1.Button1Click(Sender: TObject);
begin
Guncelle();
end;
