如何使用C++下载网络资源,其实只需要三个函数就可以搞定。他们分别是
①InternetOpen() 用来配置下载方式
②InternetOpenUrl() 打开要下载的资源
③InternetReadFile() 读取资源
下面就是一个函数用来实现网络下载功能
就像上面说的那样,如果函数中间出现失败的话,那么会出现一大堆代码去释放资源,所以下面来个用OOP思想实现的代码
①InternetOpen() 用来配置下载方式
②InternetOpenUrl() 打开要下载的资源
③InternetReadFile() 读取资源
下面就是一个函数用来实现网络下载功能
int DownFile1(char *url,char *path)
{
HINTERNET hConn = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0/*INTERNET_FLAG_ASYNC*/);
HINTERNET hIntFile = InternetOpenUrl(hConn,url,NULL,0,0,0);
if(NULL == hIntFile) {
/*使用函数就这里麻烦,释放要一大堆代码,等会上一个用类的方法*/
InternetCloseHandle(hIntFile);
InternetCloseHandle(hConn);
return 0;
}
DWORD hasRead=0,hasWrite;
HANDLE LocalFile = CreateFile(path,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
unsigned char buff[1024]={0};
BOOL hr = 0;
hr = InternetReadFile(hIntFile,buff,sizeof(buff)-1,&hasRead);
while(hasRead!=0&&hr)
{
WriteFile(LocalFile,buff,hasRead,&hasWrite,NULL);
memset(buff,0x00,sizeof(buff));
hr = InternetReadFile(hIntFile,buff,sizeof(buff)-1,&hasRead);
}
if(LocalFile) CloseHandle(LocalFile);
if(hIntFile) InternetCloseHandle(hIntFile);
if(hConn) InternetCloseHandle(hConn);
return 1;
}
就像上面说的那样,如果函数中间出现失败的话,那么会出现一大堆代码去释放资源,所以下面来个用OOP思想实现的代码
DownFile::DownFile()
{
m_hConn = NULL;
m_hInetFile = NULL;
m_hLocalFile = NULL;
}
DownFile::~DownFile()
{
if(m_hLocalFile) CloseHandle(m_hLocalFile);
if(m_hInetFile) InternetCloseHandle(m_hInetFile);
if(m_hConn) InternetCloseHandle(m_hConn);
}
int DownFile::Start(char *url,char *path)
{
this->m_hConn = InternetOpen(NULL,INTERNET_OPEN_TYPE_PRECONFIG,NULL,NULL,0);
this->m_hInetFile = InternetOpenUrl(this->m_hConn,url,NULL,0,0,0);
if(NULL == this->m_hInetFile) return 0;
/*
*面向对象的好处就在这,如果使用函数的话,
*就像DownFile1()在这里要释放一大堆资源,
*而面向对象就不用管了,全交给析构函数
*/
this->m_hLocalFile = CreateFile(path,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);
if(NULL == this->m_hLocalFile) return 0;
DWORD hasRead = 0,hasWrite;
BOOL hr = 0;
char buff[1024]={0};
hr = InternetReadFile(this->m_hInetFile,buff,sizeof(buff)-1,&hasRead);
while(0!=hasRead && hr)
{
WriteFile(this->m_hLocalFile,buff,hasRead,&hasWrite,NULL);
memset(buff,0x00,sizeof(buff));
hr = InternetReadFile(this->m_hInetFile,buff,sizeof(buff)-1,&hasRead);
}
return 1;
}