FtpWebRequest 使用进度条进行 FTP 下载

2023-12-01

我的代码有效,但是ProgressBar直接跳到100%,然后继续下载。当它完成后,就会出现一个消息框来获取信息。

我已经改变了缓冲区大小,但这并不重要。

我在这里做错了什么?

这是我的代码:

void workerDOWN_DoWork(object sender, DoWorkEventArgs e)
{
    string fileFullPath = e.Argument as String;
    string fileName = Path.GetFileName(fileFullPath);
    string fileExtension = Path.GetExtension(fileName);

    label4.Invoke((MethodInvoker)delegate { label4.Text = "Downloading File.."; });

    string ftpServerIP = "XXX";
    string ftpUserName = "XXX";
    string ftpPassword = "XXX";

    try
    {
        //Datei vom FTP Server downloaden
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://" + ftpServerIP + "/" + fileName);
        request.Credentials = new NetworkCredential(ftpUserName, ftpPassword);
        request.Method = WebRequestMethods.Ftp.DownloadFile;
        using (Stream ftpStream = request.GetResponse().GetResponseStream())
        using (Stream fileStream = File.Create(fileFullPath))
        {
            var buffer = new byte[32 * 1024];
            int totalReadBytesCount = 0;
            int readBytesCount;
            while ((readBytesCount = ftpStream.Read(buffer, 0, buffer.Length)) > 0)
            {
                fileStream.Write(buffer, 0, readBytesCount);
                totalReadBytesCount += readBytesCount;
                var progress = (int)((float)totalReadBytesCount / (float)fileStream.Length * 100);
                workerDOWN.ReportProgress((int)progress);
                label3.Invoke((MethodInvoker)delegate { label3.Text = progress + " %"; });
            }
        }
    }
    catch (WebException ex)
    {
        FtpWebResponse response = (FtpWebResponse)ex.Response;

        if (response.StatusCode == FtpStatusCode.ActionNotTakenFileUnavailable)
        {
            MessageBox.Show("Datei nicht gefunden!", "Error");
        }
    }
    e.Result = fileFullPath;
}


void workerDOWN_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
     string fileFullPath = e.Result as String;
     string fileName = Path.GetFileName(fileFullPath);

     MessageBox.Show("Download erfolgreich!","Information");

     progressBar1.Value = 0;
     label3.Invoke((MethodInvoker)delegate { label3.Text = " "; });
     label4.Invoke((MethodInvoker)delegate { label4.Text = " "; });      
}

使用 FTP 下载的简单示例FtpWebRequest使用 WinForms 进度条:

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";
        var 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:\local\path\file.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

核心下载代码基于:
在 C#/.NET 中向 FTP 服务器上传和下载文件


解释一下为什么你的代码不起作用:

  • 您正在使用目标文件的大小进行计算:fileStream.Length– 它总是等于totalReadBytesCount,因此progress永远是 100。
  • 你可能想使用ftpStream.Length,但无法读取。
  • 基本上使用 FTP 协议,您不知道正在下载的文件的大小。如果您需要知道它,则必须在下载之前明确查询。这里我使用的是WebRequestMethods.Ftp.GetFileSize为了那个原因。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FtpWebRequest 使用进度条进行 FTP 下载 的相关文章

随机推荐

  • 对于不返回 void 的 C++ 函数,是否必须使用 return 语句?

    我的 Herb Schildt 关于 C 的书说 在 C 中 如果一个函数被声明为返回一个值 那么它must返回一个值 但是 如果我编写一个具有非 void 返回类型的函数并且不返回任何内容 编译器会发出警告而不是错误 控制到达非 void
  • 根据某些条件从 Vec 中删除元素[重复]

    这个问题在这里已经有答案了 我的代码如下所示 struct Bar i i32 struct Foo v Vec
  • 一张图表中的条形图和折线图,并在 ggplot2 下带有图例

    我想将两个独立但相关系列的条形图和线图放在带有图例的同一张图表上 条形图是季度增长 线图是年度增长 我目前使用宽格式的 data frame 和如下代码来完成此操作 p lt ggplot geom bar df aes x Date y
  • 简单的函数突然抛出“发生未知错误,请稍后再试”

    从今天早上开始 我在尝试在新的 Google 工作表上运行新的应用程序脚本时收到以下消息 错误 发生未知错误 请稍后再试 我附加到现有 Google 表格的其他应用程序脚本继续运行良好 但是 如果我创建一个新工作表并添加一个简单的函数 如下
  • 在 Java 中创建悬空指针

    如何在 Java 中创建悬空指针 根据维基百科的定义 below no 计算机编程中的悬空指针和野指针是不指向适当类型的有效对象的指针 当删除或释放对象而不修改指针的值时 会出现悬空指针 这样指针仍然指向已释放内存的内存位置
  • 计算特定组的相对频率

    我有一个分类变量的 data frame 我已将其分为几组 并且获得了每组的计数 My original data nyD looks like Source local data frame 7 x 3 Groups v1 v2 v3 v
  • 停止活动中的服务

    我正在使用以下代码来停止我的服务 Intent intent new Intent MainActivity this UsageRecorderService class stopService intent 这是我的无限期服务 publ
  • 可视化编程工具

    我需要用于图形表示程序中的工作流程的工具 就像用图形表示描述电子电路一样 表示必须如下所示 函数是框 框之间的箭头是 消息 像这样 替代文本http img372 imageshack us img372 8471 functionsqv0
  • 如何减去ivy依赖集

    我的目标是将项目传递依赖关系划分为几个不交叉的集合 系统 j2ee 容器中已存在 jar 使用显式固定版本手动列出 提供 要复制到 j2ee 容器的 jar 手动列出 Ear jars 装在 Ear lib 内 其余的 下面列出的我当前的解
  • 在我的应用程序中嵌入 App Store

    我在 App Store 中看到允许您下载其他游戏的游戏 它不是将应用程序切换到应用程序商店来下载其他游戏 而是在应用程序本身中打开一个嵌入式应用程序商店 Zoo Country 就是执行此操作的应用程序的一个示例 据我所知 将某人带到应用
  • 成功安装 libtiff 但在导入时出现错误

    我使用 pip install libtiff 在 python 2 7 中成功安装了 libtiff 它成功安装了 libtiff 0 4 0 软件包 但是当我使用 import libtiff 导入包时 我收到一个错误 Tracebac
  • 将整数数组传递给 mysql 过程

    我想创建一个存储过程 它接收整数数组和一些其他输入 例如 CREATE PROCEDURE test field1 varchar 4 field2 varchar 4 array varchar 255 在存储过程中我想像这样使用它 WH
  • 将两个 SQL 查询的结果合并为单独的列

    我有两个查询返回单独的结果集 并且查询返回正确的输出 如何将这两个查询合并为一个 以便获得一个结果集 每个结果位于单独的列中 Query 1 SELECT SUM Fdays AS fDaysSum From tblFieldDays WH
  • 动态 Python 数组切片

    我面临的情况是我有一个非常大的numpy ndarray 实际上 这是一个 hdf5 数据集 我需要快速找到它的子集 因为它们整个数组无法保存在内存中 但是 我也不想迭代这样的数组 即使声明内置的 numpy 迭代器也会抛出一个Memory
  • 将周末插入仅包含工作日 MS Access 的表中

    我需要将周末插入只有工作日的表中 然后将最后一个已知值分配给周末值 我知道我需要插入查询 尽管我对 VBA 和 SQL 还很陌生 到目前为止的代码 Private Sub btnWeekends Click DoCmd SetWarning
  • 如何使用 webmethods 更新数据网格

    我选择使用 javascript PageMethod 和 WebMethod 每秒更新数据的方法 通过一个对象获得很多回报 如果它是 naeccasery 我可以设置数百个标签 2 个完整的数据库查询时间低于 200 毫秒 并且后期权重非
  • Emacs:防弹上行列表?

    我越来越up list Scan error Unbalanced parentheses 从这个位置 foo bar 片段来自up list doc 此命令假设点不在字符串或注释中 所以这是预期的行为 但我不在乎 我只想从列表中向上移动
  • 使用 MDM + Enterprise 许可证自动更新 iOS 应用程序

    我们有一个以信息亭模式运行的 iPad 应用程序 部署在多个物理位置 我们希望有一个解决方案 可以将应用程序的任何更新自动推送到设备 这样客户就不必触摸他们拥有的每台 iPad 我们的客户有一个现有的 MDM 软件 如果有更新 它会通知用户
  • Windows IoT Raspberry Pi 3 c# 创建.txt 文件

    我正在使用带有 Win IoT 的 Raspberry Pi 3 我正在尝试创建一个以数据和时间作为文件名的 txt 文件 但是 我似乎无法创建 txt 文件 我正在通过按按钮生成 log txt 文件进行测试 按下按钮后 没有错误消息 当
  • FtpWebRequest 使用进度条进行 FTP 下载

    我的代码有效 但是ProgressBar直接跳到100 然后继续下载 当它完成后 就会出现一个消息框来获取信息 我已经改变了缓冲区大小 但这并不重要 我在这里做错了什么 这是我的代码 void workerDOWN DoWork objec