C++实现文件下载功能

bool DownLoad(LPCWSTR _url, QString strfile)
{
	QByteArray arr = strfile.toLocal8Bit();
	const char* _file_name = arr.data();
	FILE* fp_download = fopen(_file_name, "wb");
	if (fp_download == NULL)
	{
		return false;
	}

	HINTERNET innet_open = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
	if (innet_open == NULL)
	{
		fclose(fp_download);
		return false;
	}


	HINTERNET innet_url = InternetOpenUrl(innet_open, _url, NULL, 0, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_PRAGMA_NOCACHE, 0);
	if (innet_url == NULL)
	{
		InternetCloseHandle(innet_url);
		return false;
	}

	//检查状态码
	DWORD http_status;
	DWORD http_status_size = sizeof(http_status);
	HttpQueryInfo(innet_url, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &http_status, &http_status_size, NULL);
	if (http_status != 200)
	{
		InternetCloseHandle(innet_url);
		InternetCloseHandle(innet_open);
		return false;
	}

	//获取接收数据大小
	DWORD file_length = 0;
	DWORD file_length_size = sizeof(file_length);
	HttpQueryInfo(innet_url, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &file_length, &file_length_size, NULL);
	if (file_length < 0)
	{
		InternetCloseHandle(innet_url);
		InternetCloseHandle(innet_open);
		return FALSE;
	}

	DWORD res_len = 1;
	DWORD read_len = 0;
	uint8_t temp_buf[DOWNLOAD_BUFFER_SIZE] = { 0 };
	while (true)
	{
		memset(temp_buf, 0, sizeof(uint8_t) * res_len);
		InternetReadFile(innet_url, temp_buf, DOWNLOAD_BUFFER_SIZE, &res_len);
		if (res_len <= 0)
			break;
		if (res_len == fwrite(temp_buf, sizeof(uint8_t), res_len, fp_download))
		{
			read_len += res_len;
		}
	}


	InternetCloseHandle(innet_url);
	InternetCloseHandle(innet_open);
	fclose(fp_download);

	return true;
}
void main()
{
	if(true == DownLoad(L"https://eval.zhihuiyunji.com/riskclient_update/", fileName)
	{
		//下载成功就解析文件,读取内容
	}
}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值