C# 文件下载 : WinINet

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

用法和一些实用技巧。

用法,Win32API 在使用时可能会烦琐一些。所以先把用到的 API 简单介绍一下。

调用的第一个方法,它会初始化内部数据结构,为后面的调用做准备。

方法用来关闭使用中打开的 Internet 句柄,释放资源。

函数,应用程序可以用它来请求数据(只要是 WinINet 支持的协议就可以)。尤其是当我们仅仅想要通过一个 URL 获取数据,而不关心通信协议相关的内容时,这个接口就特别合适。该方法会解析参数中的 URL 字符串,然后建立到服务器的连接,并准备下载由 RUL 标识的数据。

内容

支持 gzip 压缩。

方法传入 INTERNET_FLAG_RELOAD 标识。支持 gzip 压缩的,我们的客户端当然也要能够解压缩服务器传回来的 gzip 格式的数据。所以我们要在请求中告诉服务器,客户端是能够处理 gzip 数据的。只有这样,服务器才会主动的返回 gzip 格式的数据。代码如下:

referer = 0x80000000 hInetFile = NativeMethods.InternetOpenUrl(._hInet,uri.AbsoluteUri,referer,referer.Length,,IntPtr.Zero);

文件的原始名称是什么,返回的数据是以什么格式被压缩的。

[] content = count = temp = ,content, count,= Encoding.Unicode.GetString(content,,count);

方法可以得到返回数据的长度,原始的文件名称,返回数据的格式。

方法本身没什么可说的,但出于简化操作的目的,笔者对 InternetReadFile 进行了简单的封装。创建了一个继承自 Stream 的类 MyInternetReadStream。在重写的 Read 方法调用 InternetReadFile,并且添加了一个回调方法用来计算下载进度等信息。下面是代码概要,完整代码请参考 demo。

Read([] buffer, offset, dwNumberOfBytesToRead = length = ._hInetFile,._localBuffer,dwNumberOfBytesToRead,._localBuffer,._bytesReadCallback(length,

函数,创建一个新的 GZipStream 实例就可以了。

contentEncoding = (contentEncoding.IndexOf(,StringComparison.OrdinalIgnoreCase) != - GZipStream(.ForGZipReadStream(hInetFile),CompressionMode.Decompress, MyWinInet.MyInternetReadStream(hInetFile, MyWinInet.MyInternetReadStream.BytesReadCallback(

》中的实现基本相同,请参考上文,或者直接看本文的 demo。

中提到的代理问题,WinINet 的默认设置就能处理好 Credentials。不过在笔者看来,更重要的是我们可以选用不同的方式去处理下载问题。

猜你在找的C#相关文章