如何使用C++下载网络资源

如何使用C++下载网络资源,其实只需要三个函数就可以搞定。他们分别是
①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;
		
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值