2012-03-23 26 views
1

我測試WebClient類的一些特點,我決定看看DownloadProgressChanged工作,所以我做出了這樣的代碼:顯示進度使用Web客戶端下載

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()); 
} 

當我運行該應用程序,這是我所看到的進度:

Console App Shows Progress

看起來沒有什麼花哨。 Ben Albahari建議使用新線程而不是使用Async方法,並且在實際使用Async方法時,此事件處理程序非常有用。

那麼,我該如何真正地顯示進度?

編輯:

根據MSDN應該是這樣的:

被動FTP文件傳輸將始終顯示的 零進度百分比,因爲服務器沒有文件大小。出現進展, 您可以通過重寫 GetWebRequest虛方法更改FTP連接到主動:

示例代碼:

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

這是我沒有,但同樣的問題發生了:

enter image description here

+0

您已經驗證您的代碼實際上是發起非被動下載? (看看服務器日誌什麼的) – 2012-03-24 03:03:29

回答

3

從MSDN:

由於服務器未發送文件大小,因此被動FTP文件傳輸將始終顯示進度百分比爲零。爲了顯示進度,您可以通過重寫GetWebRequest虛擬方法來將FTP連接更改爲活動狀態。

Source

+0

不行不行。 – Tarik 2012-03-24 00:44:15

1

你看了documentation

由於服務器未發送文件大小,被動FTP文件傳輸將始終顯示零進程百分比 。出現進展, 您可以通過重寫 GetWebRequest虛方法更改FTP連接到主動:

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

好吧,它不起作用。我嘗試了MSDN中的內容。 – Tarik 2012-03-24 00:41:16

1

似乎有很多人問這個問題。

只要我能告訴你的服務器只報告進度,如果它被設置,你允許活動連接。它看起來像PASV(被動FTP)可以在服務器上啓用或禁用。所使用的模式應該取決於服務器的設置以及服務器和客戶端之間的內容。

編輯:我啓用了System.Net.Tracing對我的項目,並嘗試了兩種被動和主動模式,不僅如期工作......TotalBytes仍然是-1,所以我的想法是在MSDN

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

是錯誤的,或者我們失去了一些東西的說明。

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

所以重寫WebRequest的方法沒有什麼區別,如果服務器不使用活動連接。

但是......正如你可以從你自己的命令行中看到的那樣,它會正確地報告BytesReceived。

找出文件大小和你離開...

我希望有一個更有效的方法,但...我用的FtpWebRequest下載之前獲取文件大小,然後運行DownloadFileAsync並通過文件大小使用DownloadProgressCallback:

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

希望這有助於:)