本文从最简单的下载方法入手,讲述了下载文件过程中的常见问题并给出了解决方法。还展示了如何使用多线程提高HTTP的下载速度,调用aria2下载非HTTP协议的文件。对C#下载文件感兴趣的朋友来看看吧。
目录
简单下载异步下载下载文件,同时向服务器发送自定义请求头。如何解决下载文件不完整的问题?使用下载器下载非HTTP协议的文件是软件开发中常见的需求。本文从最简单的下载方法入手,讲述了下载文件过程中的常见问题并给出了解决方法。还展示了如何使用多线程加快HTTP的下载速度,调用aria2实现非HTTP协议的文件下载。
简单下载
下载文件的最简单方法。NET程序是使用WebClient的DownloadFile方法:
var URL=' https://www . coder busy . com ';
var save=@ ' D:\ 1 . html ';
使用(var web=new WebClient())
{
网络。DownloadFile(url,保存);
}
异步下载
此方法还提供异步实现:
var URL=' https://www . coder busy . com ';
var save=@ ' D:\ 1 . html ';
使用(var web=new WebClient())
{
等待网页。downloadfiletasksync(URL,save);
}
下载文件的同时向服务器发送自定义请求头
如果需要定制文件下载请求,可以使用HttpClient:
var URL=' https://www . coder busy . com ';
var save=@ ' D:\ 1 . html ';
var http=new http client();
var request=new http request message(http method。Get,网址);
//添加身份验证请求头
请求。Headers.Add('Auth ',' 123456 ');
var response=await http。SendAsync(请求);
回应。EnsureSuccessStatusCode();
使用(var fs=File。打开(保存,文件模式。创建))
{
使用(var ms=response。Content.ReadAsStream())
{
等待CopyToAsync女士(fs);
}
}
如何解决下载文件不完整的问题
以上代码在处理小文件下载时都没有特别的问题,在网络情况较差或者文件较大时容易引入错误。以下是开发中常见的代码:
var URL=' https://www . coder busy . com ';
var save=@ ' D:\ 1 . html ';
如果(!文件。存在(保存))
{
控制台。WriteLine('文件不存在,开始下载.');
使用(var web=new WebClient())
{
等待网页。downloadfiletasksync(URL,save);
}
控制台。WriteLine(“文件下载成功”);
}
控制台。WriteLine(“开始处理文件”);
//TODO:处理文件。
如果DownloadFileTaskAsync方法出现异常(通常是网络中断或网络超时),下载的不完整文件会保留在本地系统中。当任务重试时,由于文件已经存在(虽然不完整),会直接进入处理程序,从而引入异常。
解决这个问题的一个简单方法是引入异常处理,但这种方法对于因应用程序意外终止而导致的不完整文件无效:
var URL=' https://www . coder busy . com ';
var save=@ ' D:\ 1 . html ';
如果(!文件。存在(保存))
{
控制台。WriteLine('文件不存在,开始下载.');
使用(var web=new WebClient())
{
尝试
{
等待网页。downloadfiletasksync(URL,save);
}
捕捉
{
如果(文件。存在(保存))
{
文件。删除(保存);
}
扔;
}
}
控制台。WriteLine(“文件下载成功”);
}
控制台。WriteLine(“开始处理文件”);
//TODO:处理文件。
作者的首选方法是引入一个临时文件。下载操作将数据下载到临时文件中,并在确定下载操作完成时改变临时文件的名称:
var URL=' https://www . coder busy . com ';
var save=@ ' D:\ 1 . html ';
如果(!文件。存在(保存))
{
控制台。WriteLine('文件不存在,开始下载.');
//先下载到临时文件
var tmp=save ' .tmp ';
使用(var web=new WebClient())
{
等待网页downloadfiletasksync(URL,tmp);
}
文件. Move(tmp,save,true);
控制台WriteLine('文件下载成功');
}
控制台WriteLine('开始处理文件');
//TODO:对文件进行处理
使用 Downloader 进行 HTTP 多线程下载
在网络带宽充足的情况下,单线程下载的效率并不理想。我们需要多线程和断点续传才可以拿到更好的下载速度。
下载器是一个现代化的、流畅的、异步的、可测试的和可移植的。网库。这是一个包含异步进度事件的多线程下载程序下载器与。网络标准2.0及以上版本兼容,可以在Windows、Linux和马科斯上运行。
开源代码库开源地址:https://github . com/bezzad/Downloader
努格特地址:https://www。不要。组织/包/下载器
从努格特安装下载器之后,创建一个下载配置:
var download opt=新下载配置()
{
BufferBlockSize=10240,//通常,主机最大支持8000字节,默认值为8000。
ChunkCount=8,//要下载的文件分片数量,默认值为一
MaximumBytesPerSecond=1024 * 1024,//下载速度限制为1MB/s,默认值为零或无限制
MaxTryAgainOnFailover=int .最大值,//失败的最大次数
OnTheFlyDownload=false,//是否在内存中进行缓存?默认值是真实的
ParallelDownload=true,//下载文件是否为并行的。默认值为错误的
TempDirectory='C:\\temp ',//设置用于缓冲大块文件的临时路径,默认路径为路径GetTempPath()。
超时=1000,//每个流阅读器的超时(毫秒),默认值是1000
RequestConfiguration=//定制请求头文件
{
Accept='*/* ',
自动解压缩=解压缩方法. GZip |解压缩方法。放气,
CookieContainer=new CookieContainer(),//添加您的饼干
Headers=new WebHeaderCollection(),//添加您的自定义标头
KeepAlive=false,
ProtocolVersion=HttpVersion .版本11,//默认值是HTTP 1.1
UseDefaultCredentials=false,
用户代理=$ '下载程序示例/{ Assembly .GetExecutingAssembly().GetName()版本。tostring(3)} '
}
};
创建一个下载服务:
var downloader=new DownloadService(下载选项);
配置事件处理器(该步骤可以省略):
//在每次下载开始时提供"文件名"和"总字节数接收"
//在每次下载开始时提供'文件名'和'要接收的总字节数。
下载器下载开始=OnDownloadStarted
//提供有关块下载的任何信息,如每个块的进度百分比、速度、总接收字节数和实时流的接收字节数组。
//提供有关分块下载的信息,如每个分块的进度百分比、速度、收到的总字节数和收到的字节数组,以实现实时流。
下载器ChunkDownloadProgressChanged=OnChunkDownloadProgressChanged;
//提供有关下载进度的任何信息,如块总数的进度百分比、总速度、平均速度、总接收字节数和接收字节数组到实时流。
//提供任何关于下载进度的信息,如进度百分比的块数总和、总速度、平均速度、总接收字节数和接收字节数组的实时流。
下载器DownloadProgressChanged=OnDownloadProgressChanged;
//下载完成事件,可以包含已发生的错误或已取消或下载成功完成。
//下载完成的事件,可以包括发生错误或被取消或下载成功。
下载器DownloadFileCompleted=OnDownloadFileCompleted;
接着就可以下载文件了:
字符串file=@ ' D:\ 1。html ';
string URL=@ ' https://www。编码器忙。com’;
等待下载程序downloadfiletasksync(URL,file);
下载非 HTTP 协议的文件
除了网络客户端可以下载文件传送协议协议的文件之外,上文所示的其他方法只能下载超文本传送协议协议的文件。
aria2是一个轻量级的多协议和多源命令行下载工具。它支持HTTP/HTTPS、FTP、SFTP、BitTorrent和Metalink .aria2可以通过内置的JSON-RPC和XML-RPC接口进行操作。
我们可以调用aria2实现文件下载功能。
开源代码库地址:https://github.com/aria2/aria2
下载地址:https://github。com/aria 2/aria 2/发布
将下载好的aria2c.exe复制到应用程序目录,如果是其他系统则可以下载对应的二进制文件。
公共静态异步任务下载(字符串url,字符串fn)
{
var exe=' aria2c
var dir=Path .GetDirectoryName(fn);
var name=Path .GetFileName(fn);
空的输出(对象发送方,DataReceivedEventArgs参数)
{
如果(字符串IsNullOrWhiteSpace(参数。数据))
{
返回;
}
控制台WriteLine('Aria:{0} ',参数。数据?trim());
}
var args=$ '-x 8-s 8-dir={ dir }-out={ name } { URL } ';
var info=new ProcessStartInfo(exe,args)
{
UseShellExecute=false,
CreateNoWindow=true,
RedirectStandardOutput=true,
RedirectStandardError=true,
};
如果(文件。存在(fn))
{
文件。删除(fn);
}
控制台WriteLine('启动aria2c: {0} ',args);
使用(var p=新进程{ StartInfo=info,EnableRaisingEvents=true })
{
如果(!p.Start())
{
抛出新异常(‘咏叹调启动失败');
}
页(第页的缩写)错误数据接收=输出
页(第页的缩写)OutputDataReceived=Output
页(第页的缩写)BeginOutputReadLine();
页(第页的缩写)BeginErrorReadLine();
await p . WaitForExitAsync();
页(第页的缩写)输出数据接收-=输出;
页(第页的缩写)错误数据接收-=输出;
}
var fi=new FileInfo(fn);
如果(!菲。存在|| fi .长度==0)
{
引发新的FileNotFoundException(“文件下载失败,fn);
}
}
以上代码通过命令行参数启动了一个新的aria2c下载进程,并对下载进度信息输出在了控制台。调用方式如下:
var URL=' https://www。编码器忙。com’;
var save=@ ' D:\ 1。html ';
等待下载(网址,保存);
到此这篇关于使用C#下载文件的十八般武艺的文章就介绍到这了,更多相关C#下载文件内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。