C# 文件下载 : WebClient

前端之家收集整理的这篇文章主要介绍了C# 文件下载 : WebClient前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

文件更新后,下载到的还是更新前的文件

提示

分享一些心得。

增加程序的可用性。

方法,后续的文章会介绍其他的方法。博文中主要介绍思路和关键代码,完整的 demo 附在文末。

功能… 不过这会给我们的程序访问网络带来一些问题。

自带一个 Proxy 属性。也就是说,WebHttpRequest 默认会使用找到的代理。这很棒,也能处理很多情况了。可是如果这个默认的代理需要验证域用户的身份信息,这时使用 WebHttpRequest 访问网络就可能失败。此时查看 Proxy. Credentials 属性,发现它是 null。

属性默认没有设置为这个值。我们自己设置下就可以了。

request.Proxy.Credentials = CredentialCache.DefaultCredentials;

用户来指定联网的代理,并同时指定联网所需的 Credentials。写法如下:

myProxy = = NetworkCredential(ProxyUserName,ProxyUserPasswd,DomainName);

文件明明更新了,还是会有一些客户下载到旧文件。我们先来处理客户端的缓存问题。

属性就是设置缓存策略的,只是它的默认值是 BypassCache。我们把它改为 Reload 就行了:

request.CachePolicy = System.Net.Cache.RequestCachePolicy(System.Net.Cache.RequestCacheLevel.Reload);

解决办法,不过倒是有一个很好的 workaround,就是在请求中添加一个随机的字符串作为参数。

Random rdm = s =+= + s;

显示下载进度,显示实时的下载速度,允许用户取消下载:

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" alt="">

代码,我们把它分为计算下载百分比和计算当前下载速度分别介绍。

文件的长度 contentLength =[] buffer = downloadedLength = currentTimeSpanDataLength = ((currentDataLength = stream.Read(buffer,,BufferSize)) > && !+= (+= ( intDownloadSpeed = (._downloadStopWatch.ElapsedMilliseconds > num5 = ()currentTimeSpanDataLength / num6 = ()._downloadStopWatch.ElapsedMilliseconds / doubleDownloadSpeed = num5 /= ()Math.Round(doubleDownloadSpeed,= </span><span style="color: #0000ff"&gt;double</span> doubleDownloadPersent = <span style="color: #800080"&gt;0.0</span><span style="color: #000000"&gt;; </span><span style="color: #0000ff"&gt;if</span> (contentLength > <span style="color: #800080"&gt;0.0</span><span style="color: #000000"&gt;) { doubleDownloadPersent </span>= (<span style="color: #0000ff"&gt;double</span>)downloadedLength /<span style="color: #000000"&gt; contentLength; }

}

文件的长度,细节请参考本文所配 demo。

contentLength = DownloadManager.GetContentLength(myHttpWebClient);

文件流中读取一次数据,我们知道读了多少个字节(currentDataLength),累计下来就是当前已经下载了的文件长度。

downloadedLength += ()currentDataLength;

doubleDownloadPersent = ()downloadedLength / contentLength;

(._downloadStopWatch.ElapsedMilliseconds > num5 = ()currentTimeSpanDataLength / num6 = ()._downloadStopWatch.ElapsedMilliseconds / doubleDownloadSpeed = num5 /intDownloadSpeed </span>= (<span style="color: #0000ff"&gt;int</span>)Math.Round(doubleDownloadSpeed,<span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;); </span><span style="color: #008000"&gt;//</span><span style="color: #008000"&gt; 本次网速计算完成后重置时间计时器和数据计数器,开始下次的计算</span> <span style="color: #0000ff"&gt;this</span><span style="color: #000000"&gt;._downloadStopWatch.Reset(); </span><span style="color: #0000ff"&gt;this</span><span style="color: #000000"&gt;._downloadStopWatch.Start(); currentTimeSpanDataLength </span>= <span style="color: #800080"&gt;0</span><span style="color: #000000"&gt;;

}

用户取消下载

用户取消它是被深恶痛绝的!尤其是网速不太好的时候。所以我们需要给用户一个选择:可以痛快(而不是痛苦)的结束当前的旅程。

((currentDataLength = stream.Read(buffer,BufferSize)) > && !._cancelDownload){}

用户是不是按下了“取消”按钮,就是这里的 this._cancelDownload 变量。如果它是 true 就结束当前的下载。    

用户抱怨最多的几个点都搞定了。其实也没有增加多少代码,并且每个知识点看起来都是那么的细微。但很明显的提高了用户的使用体验。这也给我们带来了一些启发,完成主要功能可能只是工作中的一部分,另外的一些工作可能并不是那么明显,需要我们不断的体会,发觉…

猜你在找的C#相关文章