簡體   English   中英

使用WebClient下載顯示進度

[英]Show Progress Using WebClient Download

我正在測試WebClient類的某些功能,因此決定查看DownloadProgressChanged工作原理,因此編寫了以下代碼:

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

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

控制台應用程序顯示進度

看起來沒什么花哨的。 本·阿爾巴哈里(Ben Albahari)建議使用新線程而不是使用異步方法,並且當您實際使用異步方法時,此事件處理程序很有用。

那么我如何才能真正展現進步?

編輯:

根據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;
        }
    }

這是我所做的,但是發生相同的問題:

在此處輸入圖片說明

從MSDN:

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

資源

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

據我所知,如果設置為允許活動連接,則服務器將僅報告進度。 看起來可以在服務器上啟用或禁用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)

希望這可以幫助 :)

您閱讀過文檔嗎?

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM