Bei SendFTPFile() lässt sich mit FTPProgress() kein Fortschritt messen. Es wird der Wert für #PB_FTP_Started und der Wert für #PB_FTP_Finished geliefert, dazwischen kann ich nur '0' auslesen. Das gilt für SFTP wie für FTP. Getestet habe ich das mit den Servern bei Ionos und Hetzner.
Liegt das an den Servern? Müssen die Server irgend etwas liefern, damit ich etwas bekomme? Funktioniert es mit anderen Servern?
Kennt jemand eine andere Möglichkeit den Fortschritt beim Upload festzustellen, zb. mit API-Befehlen? Der Upload von 63MB dauert bei mir ca. 40s. Es ist blöd, wenn man dann nicht weiß, ob es funktioniert. Und ich möchte auch noch größere Dateien hochladen können.
Ich brauche die Fortschrittwerte für einen Fortschrittbalken, aber auch um ein TimeOut setzen zu können. So lange Werte kommen, soll der TimeOut-Counter immer wieder resetet werden. Ohne Fortschrittwerte kann ich nur eine Maximalzeit vorgeben (z.B. 60s), das würde dann aber die Dateigröße beschränken, oder ich muss ohne TimeOut hochladen. Das ist beides nicht befriedigend.
Hier ein Test-Programm:
Code: Alles auswählen
EnableExplicit
Enumeration
#FtpNr
EndEnumeration
Define FTP_Server$ = ""
Define FTP_UserName$ = ""
Define FTP_Password$ = ""
Define Port = 22 ; 21
Define Passiv = #False ; #True
Define Pattern$ = "Alle Dateien (*.*)|*.*"
Define PfadUndDateiname$ = OpenFileRequester("Chose File", "", Pattern$, 0)
If PfadUndDateiname$ = "" : End : EndIf
Define Dateiname$ = GetFilePart(PfadUndDateiname$)
Procedure TransferControl()
; wartet auf das Ende des Up- oder Downloads und zeigt dabei den den Fortschritt an
; wenn der Transfer nicht beginnt oder stockt wird nach 30s abgebrochen
Protected transmitted, oldtransmitted, cntr
Repeat
transmitted = FTPProgress(#FtpNr)
Select transmitted
Case #PB_FTP_Started ; -1
Debug "Dateitransfer gestartet"
Case #PB_FTP_Finished ; -3
Debug "Dateitransfer abgeschlossen"
ProcedureReturn 1
Case #PB_FTP_Error ; -2
Debug "Dateitransfer war fehlerhaft"
ProcedureReturn 0
Default
Debug "Timer: " + Str(cntr/10) + "s :: Byte: " + Str(transmitted)
If transmitted > oldtransmitted ; wenn ein Fortschritt geschieht
oldtransmitted = transmitted
cntr = 0
Else
cntr + 1 ; nur wenn der Transfer nicht läuft
EndIf
EndSelect
Delay(100)
Until cntr >= 600 ; Abbruch nach 60s Untätigkeit
AbortFTPFile(#FtpNr)
Debug "Dateitransfer Timeout (>60s Pause)"
ProcedureReturn 0 ; Zeitüberschreitung
EndProcedure
If OpenFTP(#FtpNr, FTP_Server$, FTP_UserName$, FTP_Password$, Passiv, Port)
Debug "Verbindung hergestellt"
; hier kommt der Test
If SendFTPFile(#FtpNr, PfadUndDateiname$, Dateiname$, #True) ; Asynchron
Debug "Upload:"
If TransferControl() ; wartet max. 60s auf fertig
Delay(1000)
Debug ""
Debug "Download:"
If ReceiveFTPFile(#FtpNr, Dateiname$, GetTemporaryDirectory() + Dateiname$, #True)
TransferControl() ; wartet max. 60s auf fertig
DeleteFile(GetTemporaryDirectory() + Dateiname$)
EndIf
If DeleteFTPFile(#FtpNr, Dateiname$)
Debug "Die Datei auf dem Server wurde wieder gelöscht"
Else
Debug "Konnte die Datei auf dem Server nicht löschen"
EndIf
EndIf
Else
Debug "Konnte die Datei nicht hochladen"
EndIf
CloseFTP(#FtpNr)
Else
Debug "Verbindung konnte nicht aufgebaut werden"
EndIf
PB-Version: PureBasic 6.20 (Windows - x64)
OS: Windows 8.1 64 Bit
Compilereinstellungen:
[ ] Unicode-Executable erstellen
[ ] Thread-sicheres Executable erstellen
[ ] OnError-Unterstützung einschalten
[x] Moderne Themen-Unterstützung aktivieren (für Windows XP und höher)
[ ] Administrator-Modus für Windows Vista und höher anfordern
[ ] User-Modus für Windows Vista und höher anfordern (keine Virtualisierung)
Library Subsystem: -
Grüße
Ralf