首页 文章

如何显示FTP的下载进度

提问于
浏览
5

我正在从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);

这是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() + "%";
        }

2 回答

  • 3

    UsePassive 用于"determine",当进行文件传输的连接时,它充当服务器,因此它不应与传输的实际状态有任何关系 . 请问你在哪里看过这个?

    可能是那样的

    • 对于大文件,更改非常小,所以您没有看到百分比变化?

    • 该文件小于ftpwebrequests内部缓冲区,所以你在任何"update"之前得到整个文件?

    你能在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

    我想对上面的帖子发表评论,但我太新了:(

    在覆盖Web请求方法时引用MSDN:

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

    但是,如果您的FTP服务器未设置为接受活动连接,那么在回答OP问题时,设置WebClient.UsePassive = false将没有任何区别 .

    编辑:我在我的项目上启用了System.Net.Tracing并尝试了被动模式和主动模式,不仅两者都按预期工作... 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

相关问题