2010-02-24 117 views
5

我正在從FTP站點(異步)下載文件並需要更新進度欄。我已閱讀MS文檔,指出可以完成的是WebClient類的GetWebRequest()是ovverriden,因此'UsePassive'屬性設置爲'false'。我做了這個,但'DownloadProgressChanged'事件參數ProgressPercentage總是=='0'。如何從FTP顯示下載進度

有人能告訴我如何讓這個參數開始返回值嗎?

這是下載方法:

  FTPClient request = new FTPClient(); 
      request.Credentials = new NetworkCredential(user, password); 
      request.DownloadProgressChanged += UpdateProgress; 
      request.DownloadFileAsync(ftpepath,destinationpath); 

這是FTPClient(我在哪裏重寫GetWebRequest()):

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

而且我的回調,如果有幫助:

void UpdateProgress(object sender, DownloadProgressChangedEventArgs e) 
     { 
      dwnProgress.Value = e.ProgressPercentage; 
      dwnprcnt.Text = PercentProgress.ToString() + "%"; 
     } 
+0

表明你要調用的函數在一個單獨的線程,因此不會阻止該應用程序的UI是否它或網頁的進展。 – 2010-02-24 18:55:14

回答

3

UsePassive用於在進行文件傳輸連接時「確定」誰起到服務器的作用,所以它不應該與轉移的實際狀態有任何關係。我可以問問你在哪裏看過這個?

難道

  • 的變化是非常小的一個大的文件,所以你看不到percentagechanged?
  • 該文件小於ftpwebrequests內部緩衝區,以便在任何「更新」之前獲取整個文件?

你能否在UpdateProgress中設置斷點並查看e的任何屬性中的任何內容?

作爲一個方面說明,由於您正在下載文件異步,另一個線程用於實際下載。在你的事件的方法,你可能想要做這樣的事情:

void UpdateProgress(object sender, DownloadProgressChangedEventArgs e) { 
    setProgress(e.ProgressPercentage); 
    setText(e.ProgressPercentage.ToString() + "%"); 
} 

private void setProgress(int progress){ 
    if (dwnProgress.InvokeRequired) { 
     dwnProgress.Invoke(new Action<int>(setProgress), progress); 
     return; 
    } 
    dwnProgress.Value = progress; 
} 

private void setText(string text) { 
    if (dwnprcnt.InvokeRequired) { 
     dwnprcnt.Invoke(new Action<string>(setText), text); 
     return; 
    } 
    dwnprcnt.Text = text; 
} 

這將排隊setmethods到UI線程來代替。

2

我想離開上述職位的評論,但我太新:(

參考MSDN上重寫Web請求方法:

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

在回答

但是到OPS如果問題FTP服務器未設置爲接受主動連接,然後設置WebClient.UsePassive = false將沒有什麼區別

編輯:我啓用System.Net.Tracing在我的項目,試圖被動的d活動模式,並且不僅兩者都按預期工作... TotalBytes仍然是-1,所以我的想法是MSDN上的註釋錯誤或我們錯過了某些東西

DownloadFileProgressChangedEventArgs確實包含收到的總字節數,如果您知道您可以自己計算的文件大小。

有可能是一種更好的方法......但我用一個快速的FtpWebRequest獲取文件大小,然後將其傳遞給DownloadProgressCallback方法來更新進度條。

此外,上面的海報沒有提及的是,您的更新進度方法必須調用控件,因爲它由DownloadFileAsync創建的線程調用,並且只能從創建它的線程更改控件。

您應該使用調度程序來控制

if (!myCheckBox.Dispatcher.CheckAccess()) 
{ 
    myCheckBox.Dispatcher.BeginInvoke(new Action(
    delegate() 
    { 
     myCheckBox.IsChecked = true; 
    } 
    )); 
} 
else 
{ 
    myCheckBox.IsChecked = true; 
} 

http://msdn.microsoft.com/en-us/library/ms591206.aspx