zoukankan      html  css  js  c++  java
  • C# show FTP Download/Upload progress

    https://stackoverflow.com/questions/4591059/download-file-from-ftp-with-progress-totalbytestoreceive-is-always-1


    With FTP protocol, WebClient in general does not know total download size. So you commonly get -1 with FTP.

    Note that the behavior actually contradicts the .NET documentation, which says for FtpWebResponse.ContentLength (where the value of TotalBytesToReceive comes from):

    For requests that use the DownloadFile method, the property is greater than zero if the downloaded file contained data and is zero if it was empty.
    But you will easily find out many of questions about this, effectively showing that the behavior is not always as documented. The FtpWebResponse.ContentLength has a meaningful value for GetFileSize method only.

    The FtpWebRequest/WebClient makes no explicit attempt to find out a size of the file that it is downloading. All it does is that it tries to look for (xxx bytes). string in 125/150 responses to RETR command. No FTP RFC mandates that the server should include such information. ProFTPD (see data_pasv_open in src/data.c) and vsftpd (see handle_retr in postlogin.c) seem to include this information. Other common FTP servers (IIS, FileZilla) do not do this.

    If your server does not provide size information, you have to query for size yourself before download. A complete solution using FtpWebRequest and Task:

    private void button1_Click(object sender, EventArgs e)
    {
    // Run Download on background thread
    Task.Run(() => Download());
    }

    private void Download()
    {
    try
    {
    const string url = "ftp://ftp.example.com/remote/path/file.zip";
    NetworkCredential credentials = new NetworkCredential("username", "password");

    // Query size of the file to be downloaded
    WebRequest sizeRequest = WebRequest.Create(url);
    sizeRequest.Credentials = credentials;
    sizeRequest.Method = WebRequestMethods.Ftp.GetFileSize;
    int size = (int)sizeRequest.GetResponse().ContentLength;

    progressBar1.Invoke(
    (MethodInvoker)(() => progressBar1.Maximum = size));

    // Download the file
    WebRequest request = WebRequest.Create(url);
    request.Credentials = credentials;
    request.Method = WebRequestMethods.Ftp.DownloadFile;

    using (Stream ftpStream = request.GetResponse().GetResponseStream())
    using (Stream fileStream = File.Create(@"C:localpathfile.zip"))
    {
    byte[] buffer = new byte[10240];
    int read;
    while ((read = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
    {
    fileStream.Write(buffer, 0, read);
    int position = (int)fileStream.Position;
    progressBar1.Invoke(
    (MethodInvoker)(() => progressBar1.Value = position));
    }
    }
    }
    catch (Exception e)
    {
    MessageBox.Show(e.Message);
    }
    }
    enter image description here

    The core download code is based on:
    Upload and download a binary file to/from FTP server in C#/.NET

  • 相关阅读:
    Python-2d形变 动画 表格
    Python-JS (JS介绍~JS的基础数据类型)
    Python-CSS高级 题目
    Python-ccs动画及阴影
    Python-css高级
    Python3 shevel模块,更高级的json序列化数据类型模块(比pickle更高级)
    Python3 第五周大纲(模块,导入方法、import本质,导入优化,模块的分类)
    python3 5月26日 time模块常用时间转换 &datetime()模块学习 random()
    Python软件目录结构
    Python3 json &pickle 数据序列化
  • 原文地址:https://www.cnblogs.com/wgscd/p/10142095.html
Copyright © 2011-2022 走看看