Einzelnen Beitrag anzeigen

daniel775

Registriert seit: 27. Nov 2010
46 Beiträge
 
#1

FTP Indy Komponente, Event OnWork und der Parameter AWorkCount

  Alt 22. Okt 2017, 20:57
Guten Abend,


bin gerade dabei in mein Updatemodul eine Dateiübertragung per FTP bzw. HTTP Protokoll zu integrieren. Irgendwie will mir das Feature mit der Progressbar nicht gelingen.
Genau genommen gibt es zwei Progressbars. Eine für die einzelne Datei die gerade übertragen wird und eine für den Gesamtfortschritt.
Eigentlich ist das was ich nicht hinbekomme ja ein Schönheitsfehler. Meine Progressbar für die Dateien bleibt nach der Übertragung bei 99% stehen und meine Progressbar für den Gesamtfortschritt bei 96%.

Es werden zum Test 5 Dateien per FTP Protokoll vom FTP zu dem meinen Rechner übertragen. Der FTP-Server sitzt im lokalen Netz. Die Dateien haben folgende Größen in Byte:

1.874.053.550
62.230.016
62.634
22.458
1
Summe: 1.936.368.659 Bytes

Um dem ganzen auf die Schliche zu kommen habe ich eine Feldvariable ausserhalb der Prozedur die FBytesLast heisst. Am Ende der IdFTPWork Prozedur speichere ich den aktuellen AWorkCount Stand in diese Variable FBytesLast. Am Anfang der Prozedur werte ich diesen Stand aus mit:

Code:
FLastBytes := (AWorkCount - FLastBytes);
if FShowCnt < 400 then
    memo.Lines.Add(FormatFloat('#,##0', FLastBytes));
Mit den nächsten 400 aufrufen der IdFTPWork Prozedur werden diese übertragenen Bytes in ein Memo geschrieben.

Code:
58
360
4.294.966.992
4.294.967.250
58
360
32.350
29.866
4.294.927.120
4.294.944.839
113
32.654
32.768
32.768
32.768
32.768
32.768
Mit einer der ersten Aufrufe werden 58 Bytes dann 360 Bytes übertragen und irgenwann im Laufe der Übertragungen Konstant 32 Kilobyte. Und jetzt zu meiner Frage die mir warscheinlich die letzten 4% zu den 100% in der Progressbar für den Gesamtfortschritt versauen. Was haben diese Werte in AWorkCount zu suchen? 4.294.966.992, 4.294.967.250, 4.294.927.120, 4.294.944.839

Falls sich jetzt einige Fragen, warum ich nicht in der OnBegin Ereignisprozedur den Wert aus dem Parameter AWorkCountMax übernehme. Weil der Parameter AWorkCountMax leider nur beim Upload > 0 ist. Beim Download muss man umständlich Rekusiv durch die Ordnerstrukturen um mit der Prozedur Size die zu übertragenen Bytes zu ermitteln. Lass mich aber gern eines besseren belehren. Wenn jemand einen Vorschlag hat das zu vereinfachen.

Geändert von daniel775 (22. Okt 2017 um 21:04 Uhr)
  Mit Zitat antworten Zitat