如何显示FTP的下载进度

Nic*_*ick 5 c# ftp webclient

我正在从FTP站点(Async)下载文件,需要更新进度条.我已经阅读了MS文档,声明可以做到这一点是WebClient类的GetWebRequest()是ovverriden所以'UsePassive'属性被设置为'false'.我已经这样做但是'DownloadProgressChanged'事件参数ProgressPercentage总是=='0'.

有人能告诉我如何让这个论点开始返回值吗?

这是下载方法:

            FTPClient request = new FTPClient();
            request.Credentials = new NetworkCredential(user, password);
            request.DownloadProgressChanged += UpdateProgress;
            request.DownloadFileAsync(ftpepath,destinationpath);
Run Code Online (Sandbox Code Playgroud)

这是FTPClient(我将覆盖GetWebRequest()):

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

如果它有帮助我的回调:

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

Pat*_*ick 3

UsePassive用于在建立文件传输连接时“确定”谁充当服务器,因此它不应该与传输的实际状态有任何关系。请问您在哪里读过这篇文章?

难道是这样

  • 对于大文件来说,更改非常小,所以您看不到更改的百分比?
  • 该文件小于 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;
}
Run Code Online (Sandbox Code Playgroud)

这会将 setmethods 排队到 UI 线程。