Avatar billede hugopedersen Nybegynder
22. november 2012 - 08:59 Der er 4 kommentarer og
1 løsning

Download via FTP

Jeg er på udkig efter et eksempel på hvordan man kan downloade en bestemt fil fra en FTP server med delphi/Indy
Jeg er specielt på udkig efter et eksempel på hvordan man får fremskridt i download vist på en progressbar

Jeg har fundet flere eksempler på download og det kan jeg som sådan godt få til at virke, men ikke lige det med progress
Avatar billede kroning Nybegynder
22. november 2012 - 10:28 #1
23. november 2012 - 18:41 #2
Trin 1.
Sæt en progressBar på din form.

Trin2.
Globale variabler.
var
  FilLen: LongInt;
  StartTid: TDateTime;
  DlRest, DlCount: Real;
  TickStart: Cardinal;

Trin 3.
På dit IdFTP komponent, i Object Inspector, indsætter du "IdFTPWork" i feltet OnWork.

Det giver:
procedure TForm.IdFTPWork(Sender: TObject; AWorkMode: TWorkMode;
  const AWorkCount: Integer);
var
  Rest: Real;
begin
  ProgressBar1.Position := AWorkCount;
  try
    Rest := (FilLen - AWorkCount) / (AWorkCount / SecondsBetween(Time, StartTid));
  except
    on E: Exception do
      Rest := 0;
  end;
  DlCount := DlCount + 1;
  DlRest := DlRest + Rest;
  if (GetTickCount - TickStart) >= 1000 then // For hvert sekund
  begin
    Label2.Caption := 'Forventet resterende tid: ' + IntToStr(Round(DlRest / DlCount)) + ' sekunder';
    TickStart := GetTickCount;
    DlRest := 0;
    DlCount := 0;
    Label3.Caption := IntToStr(AWorkCount) + ' af ' + IntToStr(FilLen) + ' bytes overført.';
    Application.ProcessMessages;
  end;
end;
Avatar billede hugopedersen Nybegynder
23. november 2012 - 19:18 #3
Problemet ligger åbenbart i at man ikke kan regne med at aWorkCountMax indeholder den rigtige værdi når FTP begynder.
Man er derfor nødt til at snyde og finde størrelsen på filen på anden vis
(som beskrevet i link fra kroning - så et svar)

Her er et par udpluk af min løsning som nu ser ud til at virke efter hensigten.

  FileCount := idFTP.DirectoryListing.Count;
  try
    for intX := 0 To FileCount - 1 do
      begin
        if idFTP.DirectoryListing.Items[intX].ItemType = ditFile then
        begin
          FileName := idFTP.DirectoryListing.Items[intX].FileName;
          if FileName = Settings.Runtime.FileRemote then
            begin
              barProgress.Max := idFTP.DirectoryListing.Items[intX].Size;
              try
                idFTP.Get(FileName, Settings.Ftp.FolderLocal + FileName, True);
                Log('FTP download: '+ FileName);
              except
                Log('Error getting file: ' + FileName);
              end;
            end;
        end;
      end;
  finally
    idFTP.Abort;
    idFTP.Disconnect;
  end;

procedure TfrmMain.idFTPWorkBegin(aSender: TObject; aWorkMode: TWorkMode; aWorkCountMax: Int64);
begin
//  barProgress.Max := aWorkCountMax;
  Log('Starting download ' + IntToStr(aWorkCountMax));
end;

procedure TfrmMain.idFTPWork(aSender: TObject; aWorkMode: TWorkMode; aWorkCount: Int64);
begin
  barProgress.Position := aWorkCount;
  Log('Working ' + IntToStr(aWorkCount));
end;
Avatar billede hugopedersen Nybegynder
23. november 2012 - 19:20 #4
@anton  jeg kan godt se fidusen i din kode men da det her kun er til at hente en opdatering af et program fra min FTP server, så forsøger jeg at lave et KISS program :-)
Avatar billede kroning Nybegynder
23. november 2012 - 19:25 #5
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester