提供基于.Net 4.0下的几种方法,不采用4.5的原因很简单,XP不支持

方法一:迅雷

迅雷下载组件,此方法有一个致命缺点,就是同局域网会抢占其它电脑网速,让局域网的其它人瞬间想骂GAI

  • 添加XLEngine.cs类到项目里
  • 添加xldl.dll类到项目里

复制到输出目录:如果较新则复制
生成操作:内容

  • 添加download目录到项目里,里面的所有文件也要按照以下属性设置

复制到输出目录:如果较新则复制
生成操作:内容

XLEngine.cs其它文件下载地址:链接:https://pan.baidu.com/s/1JmHmFne5wfP1imwPpUEQpg 提取码:mz5o

文件目录结构如图所示:

project
└───download
│    atl71.dll
│    dl_peer_id.dll
│    download_engine.dll
│    id.dat
│    MiniThunderPlatform.exe
│    minizip.dll
│    msvcp71.dll
│    msvcr71.dll
│    XLBugHandler.dll
│    XLBugReport.exe
│    zlib1.dll
└───XLEngine.cs
└───xldl.dll
  • 设置任务参数
XL.DownTaskParam p = new XL.DownTaskParam()
{
    szTaskUrl = item.url,
    szFilename = item.savefilename,
    szSavePath = App.downSaveDirPath
};
  • 创建下载任务,返回句柄,后面可以通过句柄获取当前任务状态
var hi = XL.XL_CreateTask(p);
  • 开始下载任务,使用任务句柄开始对应下载任务的下载工作,返回布尔值
var result = XL.XL_StartTask(hi);
  • 实例化一个下载任务信息对象,通过任务句柄,可以将任务的当前信息返回到下载任务信息对象中
XL.DownTaskInfo info = new XL.DownTaskInfo();
var flag = XL.XL_QueryTaskInfoEx(hi, info);

DownTaskInfo里主要有如下属性,还有其它属性,自己研究吧

  • stat:任务状态
  • fail_code:错误代码
  • szFilename:存储文件名
  • szSavePath:存储位置目录
  • fPercent:进度,乘100就是百分比

通过info.stat == XL.DOWN_TASK_STATUS.TSC_COMPLETE,可以判断任务是否下载完成,XL.DOWN_TASK_STATUS中存储的是任务的各种下载状态

方法二:WebClient

此方法可上传,可下载文件

下载文件

  • 构建下载任务
WebClient client = new WebClient();
client.DownloadFileCompleted += client_DownloadFileCompleted;
client.DownloadProgressChanged += client_DownloadProgressChanged;
client.DownloadFileAsync(new Uri(url(" ", "%20")), System.IO.Path.Combine(dir_path, "file.zip"));

下载地址中的空格需要用转移字符替换了

  • 绑定事件
private static void client_DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    App.MainWindow.Dispatcher.Invoke((Action)delegate
    {
        App.MainWindow.progress_state.Maximum = (int)e.TotalBytesToReceive;
        App.MainWindow.progress_state.Value = (int)e.BytesReceived;
        App.MainWindow.txt_state.Text = "总下载:" + e.ProgressPercentage + "%";
    });
}

private static void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
    App.MainWindow.Dispatcher.Invoke((Action)delegate
    {
        App.MainWindow.progress_state.Value = 100.0;
        App.MainWindow.txt_state.Text = "下载完成...";
    });
}

如果下载地址是传的文件流,需要在头标识里添加文件流的长度,不然进度条会失效,但是不影响下载

上传文件

和下载文件基本相同,只是调用的方法不同

  • UploadFileCompleted
  • UploadProgressChanged
  • UploadFileAsync
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐