65.9K
CodeProject 正在变化。 阅读更多。
Home

下载器组件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (20投票s)

2007年1月14日

2分钟阅读

viewsIcon

88679

downloadIcon

3792

一个通过网络下载文件的组件,支持代理、SSL 和断点续传。

Sample Image - Downloader.jpg

引言

通过网络下载文件可能是一项繁琐的任务。 尝试实现其他功能,如自动续传和对代理服务器的支持等,会使其更加困难。 使用此组件可以让你更容易地完成任务。 只需设置几个属性,即可通过代理、密码保护的站点或不受信任的 SSL 连接下载文件。 提供的示例演示了如何完成这项工作以及如何通过简单的 GUI 处理事件。

由于下载操作在工作线程中异步进行,您无需担心下载大文件或阻塞用户界面。 但您需要记住一些事项。

中止工作线程

停止正在运行的下载操作很棘手。 您可以简单地在下载器线程上调用 DownloadThread.Abort() 方法来停止工作,但这不是推荐的方法。 这样做的主要原因是 Thread.Abort 会抛出一个异常,该异常可能在您工作的任何时候发生,并使您的运行状态不一致。 更简单的方法是检查一个布尔字段,并在设置该字段时终止操作,或者在完全不同的进程上运行作业。 要了解更多关于这个想法的信息,请查看 Ian Griffiths 的博客文章 here

更新 GUI

运行下载作业时,下载器组件通过事件和自定义 eventargs 提供其内部进度和错误状态。 由于 eventargs 在工作线程上构建,尝试从工作线程更新用户界面会抛出跨线程异常。 更新用户界面的解决方法是使用 Invoke 方法(从 Control 继承)、一个委托和对必要方法(如 this)的调用

private delegate void ParamMethodInvoker
    (long fileSize, long progressValue, string message);

/// <summary>
/// Call UpdateProgress method using a delegate and provide method parameters
/// </summary>
private void OnDownloadProgressChanged
    (object sender, DownloadProgressEventArgs e)
{
    Invoke(new ParamMethodInvoker(UpdateProgress), new object[] 
        { e.BytesRead, e.TotalBytes, e.Message });
}

/// <summary>
/// Normally update the user interface
/// </summary>
private void UpdateProgress(long bytesRead, long totalBytes, string message)
{
    int kbRead = Convert.ToInt32(bytesRead) / 1024;
    int kbTotal = Convert.ToInt32(totalBytes) / 1024;
    int percent = Convert.ToInt32((bytesRead * 100) / totalBytes);

    progress.Value = percent;
    lblDownloadMessage.Text = 
        string.Format("{0:#,###} of {1:#,###} KBytes ({2}%)", 
        kbRead, kbTotal, percent);
}

恢复下载

要恢复下载作业,我们可以简单地从上次中断的地方继续。 重新启动下载作业时,下载器组件首先检查指定位置是否存在现有文件(通过 DownloadPath 属性)。 如果文件存在,它会读取现有文件的 Length 并使用 AddRange 方法设置 HttpWebRequest 的范围。 AddRange 方法的重载可用于处理单个文件的多部分下载。

long startingPoint = 0;

if(File.Exists(DownloadPath))
{
    startingPoint = new FileInfo(DownloadPath).Length;
}

HttpWebRequest _Request = (HttpWebRequest)HttpWebRequest.Create(url);
_Request.AddRange(startingPoint);

关注点

实现其他功能,例如多部分下载(如下载加速器应用程序)和 FTP 下载,似乎是一个好主意。 欢迎提出任何建议/意见/反馈。

历史

版本 1

  • 提供了具有基本功能和事件的组件
  • 提供了一个基本表单来显示组件的功能
© . All rights reserved.