c# - 我们如何使用 FtpWebRequest 显示上传进度条

标签 c# winforms ftp progress-bar ftpwebrequest

我正在使用 FtpWebRequest 将文件上传到 ftp。我需要显示完成了多少的状态。

到目前为止我的代码是:

public void Upload(string filename, string url)
{
    FileInfo fileInf = new FileInfo(filename);
    string uri = "ftp://" + url + "/" + fileInf.Name;
    FtpWebRequest reqFTP;
    //string uri = "ftp://" + Host + "/public_html/testing/blogtest/" + fileInf.Name;

    // Create FtpWebRequest object from the Uri provided
    reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(uri));

    // Provide the WebPermission Credintials
    reqFTP.Credentials = new NetworkCredential(Username, Password);

    // By default KeepAlive is true, where the control connection is not closed
    // after a command is executed.
    reqFTP.KeepAlive = false;
    //reqFTP.UsePassive = true;
    // Specify the command to be executed.
    reqFTP.Method = WebRequestMethods.Ftp.UploadFile;

    // Specify the data transfer type.
    reqFTP.UseBinary = true;

    // Notify the server about the size of the uploaded file
    reqFTP.ContentLength = fileInf.Length;

    // The buffer size is set to 2kb
    int buffLength = 2048;
    byte[] buff = new byte[buffLength];
    int contentLen;

    // Opens a file stream (System.IO.FileStream) to read the file to be uploaded
    FileStream fs = fileInf.OpenRead();

    // Stream to which the file to be upload is written
    Stream strm = reqFTP.GetRequestStream();

    // Read from the file stream 2kb at a time
    contentLen = fs.Read(buff, 0, buffLength);

    // Till Stream content ends
    while (contentLen != 0)
    {
        // Write Content from the file stream to the FTP Upload Stream
        strm.Write(buff, 0, contentLen);
        contentLen = fs.Read(buff, 0, buffLength);
    }

    // Close the file stream and the Request Stream
    strm.Close();
    fs.Close();
}

最佳答案

最简单的方法是使用 BackgroundWorker 并将您的代码放入 DoWork 事件处理程序中。并使用 BackgroundWorker.ReportProgress 报告进度。

基本思路:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
    var ftpWebRequest = (FtpWebRequest)WebRequest.Create("ftp://example.com");
    ftpWebRequest.Method = WebRequestMethods.Ftp.UploadFile;
    using (var inputStream = File.OpenRead(fileName))
    using (var outputStream = ftpWebRequest.GetRequestStream())
    {
        var buffer = new byte[1024 * 1024];
        int totalReadBytesCount = 0;
        int readBytesCount;
        while ((readBytesCount = inputStream.Read(buffer, 0, buffer.Length)) > 0)
        {
            outputStream.Write(buffer, 0, readBytesCount);
            totalReadBytesCount += readBytesCount;
            var progress = totalReadBytesCount * 100.0 / inputStream.Length;
            backgroundWorker1.ReportProgress((int)progress);
        }
    }
}

private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    progressBar.Value = e.ProgressPercentage;
}

确保启用WorkerReportsProgress

backgroundWorker2.WorkerReportsProgress = true;

使用 BackgroundWorker,您还可以轻松实现上传取消。

关于c# - 我们如何使用 FtpWebRequest 显示上传进度条,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6341024/

相关文章:

javascript - Request.QueryString 未定义

c# - 编译器错误 CS1002;预期的 C#

调用的目标已抛出 C# 异常

c# - 如何将 POCO 对象列表绑定(bind)到 Windows 窗体 DataGrid

c# - 验证 TextBox 中的文本更改

iOS:使用 PDF 下载的应用程序,建议使用哪种方法? (ftp,休息, SOAP ,..)

c# - 我想在 C# 中将日期 "2018-05-18 17:16:24.570"转换为 "7/26/2018, 10:42 AM"格式

c# - Entity Framework 在循环集合中返回 NULL

node.js - 如何远程更新实时 Node.js Heroku 应用程序?

c# - 远程服务器返回错误 : (550) on upload file to FTP using FtpWebRequest