2012-03-23 16 views
1

ich einige Features von WebClient Klasse am Testen und ich beschlossen, zu sehen, wie DownloadProgressChanged funktioniert so machte ich einen solchen Code auf:Status anzeigen Mit WebClient herunterladen

static void Main(string[] args) 
{ 
    WebClient client = new WebClient(); 
    client.Proxy = null; 
    client.BaseAddress = "ftp://ftp.xxxxxxx.com"; 
    CredentialCache cache = new CredentialCache(); 
    NetworkCredential credential = new NetworkCredential("userxxx", "passxxxx"); 
    client.Credentials = credential; 
    client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged); 
    Uri remoteFile; 
    Uri.TryCreate("/public_html/folderxxxx/Pictures/Product/Resized/1.jpg", System.UriKind.Relative, out remoteFile); 

    client.DownloadFileAsync(remoteFile, "1.jpg"); 
    System.Diagnostics.Process.Start("1.jpg"); 
    Console.ReadLine(); 
} 

static void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e) 
{ 
    Console.WriteLine(e.ProgressPercentage.ToString()); 
} 

Wenn ich diese Anwendung ausführen, das ist, was ich sehe, wie Fortschritt:

Console App Shows Progress

Sieht nichts Besonderes. Ben Albahari schlägt vor, einen neuen Thread anstelle der Async-Methode zu verwenden, und dieser Event-Handler ist nützlich, wenn Sie tatsächlich die Async-Methode verwenden.

Also, wie kann ich Progress wirklich zeigen?

EDIT:

Ein passiver FTP-Dateitransfer wird immer einen Fortschritt Prozentsatz der Null zeigen, da der Server die Dateigröße nicht gesendet hat

Laut MSDN soll dies geschehen . Um zu zeigen, Fortschritt, Sie die FTP-Verbindung zum aktiven ändern können, indem Sie die GetWebRequest virtuelle Methode überschrieben:

Beispielcode:

internal class MyWebClient:WebClient{ 
     protected override WebRequest GetWebRequest(Uri address) { 
      FtpWebRequest req = (FtpWebRequest)base.GetWebRequest(address); 
      req.UsePassive = false; 
      return req; 
     } 
    } 

Was ist das, was ich tat, aber das gleiche Problem passiert:

enter image description here

+0

Haben Sie sich vergewissern, dass der Code tatsächlich einen nicht-passiven Download initiieren? (Schauen Sie sich die Serverprotokolle oder etwas an) –

Antwort

3

Von MSDN:

Eine passive FTP-Dateiübertragung zeigt immer einen Fortschrittsprozentsatz von Null an, da der Server die Dateigröße nicht gesendet hat. Um den Fortschritt anzuzeigen, können Sie die FTP-Verbindung in active ändern, indem Sie die virtuelle Methode GetWebRequest überschreiben.

Source

+0

Nein, es funktioniert nicht. – Tarik

1

Haben Sie die documentation ??

Ein passiver FTP-Dateitransfer zeigt immer einen Fortschritt Prozentsatz der Null, da der Server die Dateigröße nicht gesendet haben. Um zu zeigen, Fortschritt, können Sie die FTP-Verbindung aktiv ändern, indem das Überschreiben der GetWebRequest virtuelle Methode:

internal class MyWebClient:WebClient{ 
     protected override WebRequest GetWebRequest(Uri address) { 
      FtpWebRequest req = (FtpWebRequest)base.GetWebRequest(address); 
      req.UsePassive = false; 
      return req; 
     } 
    } 
+0

Nun, es funktioniert nicht. Ich habe versucht, was in MSDN gesagt wurde. – Tarik

1

Es scheint eine Menge Leute, um diese Frage zu stellen.

Soweit ich sagen kann Ihr Server nur zurück melden Fortschritt, wenn es eingestellt ist, erlauben Sie aktive Verbindungen. PASV (passives FTP) kann auf dem Server aktiviert oder deaktiviert werden. Und der verwendete Modus sollte davon abhängen, was der Server verwenden soll und was zwischen Server und Client ist.

EDIT: Ich habe System.Net.Tracing auf meinem Projekt aktiviert und versuchte sowohl passive und aktive Modi und nicht nur funktionieren beide wie erwartet ...Totalbytes ist noch -1 so mein Denken ist der Hinweis auf MSDN

http://msdn.microsoft.com/en-US/library/system.net.webclient.downloadprogresschanged(v=vs.80).aspx

irrt oder uns fehlt etwas.

http://compnetworking.about.com/cs/protocolsftp/g/bldef_pasv.htm

http://slacksite.com/other/ftp.html

http://fetchsoftworks.com/fetch/help/Contents/Concepts/ActiveAndPassive.html

So die WebRequest Methode überschrieben wird keinen Unterschied machen, wenn der Server aktive Verbindungen nicht verwendet werden.

Allerdings ... wie Sie aus Ihrer eigenen Befehlszeile lesen können meldet es die BytesReceived korrekt zurück.

die Dateigröße Finden Sie heraus, und du bist weg ...

Ich erwarte, dass es eine effizientere Methode ist aber ... Ich habe eine FtpWebRequest die Dateigröße zu erhalten, bevor das Herunterladen und dann DownloadFileAsync laufen und übergeben die Dateigröße auf den DownloadProgressCallback mit:

Client.DownloadProgressChanges += (sender, e) => DownloadProgressCallback(fileSize, e) 

this helps :)

Verwandte Themen