四种语言实现文件下载
文/ 牵着蜗牛去散步
文件下载在软件更新、木马升级中起到了至关重要的作用,通过Web服务器实现程序升级是最简单的方法,今天我们就简单谈谈时下流行的文件下载技术,并以目前最流行的四种编程语言一一介绍。
使用时下最流行的Ajax技术
Ajax技术就是通过异步方式使用Xmlhttp方法来下载文件,本文使用的是MSXML2.serverXMLHTTP,对于远程服务器兼容性比较好。我测试了多种Web服务器,通常使用microsoft.XMLHttp方式传输被服务器 Location 重定向后,可能无易做图常下载造成msxml拒绝访问的错误,所以这里没有使用。
考虑到FSO组件可能被部分机器禁用,我也没有使用Scripting.FileSystemObject方式,而是使用了ADO流对象,可以更简单方便地写入文件。打开记事本,输入下面的VBS代码就可以实现文件下载了。具体实现代码如下。
Dim xml,ado
On Error Resume Next ‘防止程序意外崩溃
Set xml=createObject("MSXML2.serverXMLHTTP")
‘创建xmlhttp对象
xml.Open "GET","
‘下载baidu徽标,图片是二进制文件方便测试,同样也可以下载exe可执行文件。
xml.Send()
Set ado=createObject("ADODB.Stream") ‘创建ADO流对象
ado.Mode=3 ‘模式为 可写入读取adModeReadWrite
ado.Type=1 ‘类型为二进制adTypeBinary
ado.Open()
ado.Write(xml.responseBody)
ado.SaveToFile "c:aidu.gif",2
‘下载文件的路径,2代表adSaveCreateOverWrite,如果文件已存在则覆盖
Msgbox "文件已经下载完成", vbOKOnly, "状态提示"
使用Windows API函数
在Windows中,微软提供了一个轻量型下载文件函数UrlDownloadToFile(),它是通过urlmon动态库引出的函数,VB声明形式如下:
Private Declare Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long
它有五个参数,我们只需要关心第二个和第三个参数就可以了。第二个参数是欲下载文件的Url,第三个参数是文件保存路径,实现下载的代码如下。
On Error Resume Next 防止程序意外崩溃
Dim ret As Integer
ret = URLDownloadToFile(0, "", "c:aidu.gif", 0, 0)
百度网站上下载baidu徽标图片,保存到C盘根目录下
If ret = 0 Then
MsgBox "文件已经下载完成", vbOKOnly, "状态提示"
End If使用.Net Framework类库下载
.Net技术也是未来的发展方向,从Windows 2003到Vista,已经内置了.Net的运行时库,从而为我们提供了方便的下载方式,这里我们就用C#实现文件下载。启动Visual Stdio.Net 2003,新建一个Windows应用程序,实现代码如下。
using System.Net; //首先我们需要引用网络库
try
{
WebClient myWebClient = new WebClient(); //使用WebClient类下载
string WebResource = ""; //远程Url
string savePath="c:\baidu.gif"; //存放路径
myWebClient.DownloadFile(WebResource,savePath); //DownloadFile方法下载
MessageBox.Show("文件已经下载完成","状态提示");
}
catch(Exception myError)
{
MessageBox.Show("远程文件无法下载!"+myError.ToString());
}Windows Internet库下载
Windows网络通讯的底层是通过Socket套接字完成的,因此我们可以使用Windows 网络库Wininet动态库来实现下载,它比URLDownloadToFile更稳定高效,下载文件不受缓存的影响,同时支持FTP文件传输协议。具体的C语言实现下载文件的代码如下。
#include <wininet.h> //包含wininet头文件
#pragma comment(lib,"wininet")HINTERNET hSession = InternetOpen("", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if (hSession != NULL)
{
HINTERNET hLink2= InternetOpenUrl(hSession,"", NULL, 0, INTERNET_FLAG_DONT_CACHE, 0); //下载文件不检查缓存
if (hLink2 != NULL)
{
BYTE Temp[1024];
DWORD dwNum = 1;
FILE *hFile;
if( (hFile = fopen( "c:\baidu.gif", "wb" )) != NULL )
{
while (dwNum > 0)
{
InternetReadFile(hLink2, Temp, 1024 - 1, &dwNum);
fwrite(Temp, sizeof (char), dwNum , hFile); //写入文件
}
fclose( hFile );
MessageBox(0,"文件已经下载完成","状态提示",0);
}
InternetCloseHandle(hLink2);
hLink2 = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}至此,我们就使用不同语言实现了多种文件下载的技术。网上的Web免费空间还有很多,配合标志文件很轻松的就可以实现自动更新了,把它加入到我们的程序中就能实现自动升级功能了,赶快试试吧!
补充:综合编程 , 其他综合 ,