So zeigen Sie den download-Fortschritt von FTP
Ich bin das herunterladen einer Datei von einer FTP-site (Async) und benötigen ein update ein Fortschritt bar. Ich habe gelesen, MS-Dokumentation, die besagt, dass dies getan werden kann, ist die WebClient-Klasse ist GetWebRequest() ist ovverriden so die 'UsePassive' - Eigenschaft auf 'false'. Ich habe dies getan, aber " DownloadProgressChanged event-argument ProgressPercentage ist immer == '0'.
Kann mir jemand sagen, wie man dieses argument zu beginnen Rückkehr der Werte?
Dies ist der download-Methode:
FTPClient request = new FTPClient();
request.Credentials = new NetworkCredential(user, password);
request.DownloadProgressChanged += UpdateProgress;
request.DownloadFileAsync(ftpepath,destinationpath);
Dies ist der FTPClient (wo ich bin übergeordnete GetWebRequest()):
class FTPClient : WebClient
{
protected override WebRequest GetWebRequest(System.Uri address)
{
FtpWebRequest req = (FtpWebRequest) base.GetWebRequest(address);
req.UsePassive = false;
return req;
}
}
Und meine Callback-wenn es hilft:
void UpdateProgress(object sender, DownloadProgressChangedEventArgs e)
{
dwnProgress.Value = e.ProgressPercentage;
dwnprcnt.Text = PercentProgress.ToString() + "%";
}
- Um den Fortschritt zu zeigen, müssen Sie rufen Sie die Funktion in einem separaten thread, so dass es blockiert die Benutzeroberfläche der Anwendung, ob Ihr für oder web-Seite.
Du musst angemeldet sein, um einen Kommentar abzugeben.
UsePassive
wird verwendet, um "festzustellen", die als server fungiert, wenn die Verbindung für die Dateiübertragung erfolgt, so sollte es nicht haben nichts mit den tatsächlichen status der übertragung. Darf ich Fragen wo du dies gelesen haben?Könnte es sein, dass
Können Sie einen Haltepunkt festlegen UpdateProgress und nichts sehen in jedem e Eigenschaften?
Und als eine Randnotiz, da Sie den Download der Datei async, ein weiterer thread ist für die eigentliche download. In Ihrem Ereignis-Methode, möchten Sie wahrscheinlich etwas wie das hier tun:
Die Warteschlange der setmethods an den UI-thread statt.
Wollte ich einen Kommentar zu dem obigen post, aber ich bin zu neu ist 🙁
Verweis auf MSDN zum überschreiben der web-request-Methode:
http://msdn.microsoft.com/en-US/library/system.net.webclient.downloadprogresschanged(v=vs. 80).aspx
Jedoch in Antwort auf OPs Frage, wenn Ihr FTP-server nicht gesetzt sind, zu akzeptieren aktiven verbindungen, dann Einstellung WebClient.UsePassive = false gesetzt ist, wird das keinen Unterschied machen.
EDIT: ich System aktiviert.Net.Ablaufverfolgung auf mein Projekt und versucht, sowohl die passive und aktive Modi und nicht nur, beide arbeiten als erwartet... TotalBytes noch -1, damit mein denken ist der Hinweis auf der MSDN-Website in die Irre oder sind wir etwas fehlt
Den DownloadFileProgressChangedEventargs enthält die insgesamt empfangenen bytes und wenn Sie wissen, die Größe der Datei, können Sie berechnen sich.
Es ist wahrscheinlich der bessere Weg... Aber ich habe eine schnelle FtpWebRequest um die Größe der Datei und übergeben diese an die DownloadProgressCallback Methode, die Statusanzeige zu aktualisieren.
Auch was das obige Plakat nicht zu erwähnen, ist, dass Ihre update-progress-Methode aufrufen müssen Sie das Steuerelement, denn es wird aufgerufen, indem der thread erstellt DownloadFileAsync und können Sie nur ändern, eine Steuerung aus dem thread, der es erstellt.
Sollten Sie den dispatcher für die Steuerung z.B. von
Sehen http://msdn.microsoft.com/en-us/library/ms591206.aspx