C++ 下载文件到本地实例

#include <iostream>
#include <afxinet.h>
#include <wininet.h> 
#pragma comment( lib, "wininet.lib" )


#define MAXBLOCKSIZE 1024

using namespace std;

bool DownloadFileAndSaveToLocal1(char* url, char* localPath)
{
//存放的路径
WCHAR newLocalPathName[256];
memset(newLocalPathName, 0, sizeof(newLocalPathName));
MultiByteToWideChar(CP_ACP, 0, localPath, strlen(localPath) + 1, newLocalPathName, sizeof(newLocalPathName) / sizeof(newLocalPathName[0]));
//字符串转换
WCHAR wszUrlName[256];
WCHAR wszPathName[1024];
memset(wszUrlName, 0, sizeof(wszUrlName));
memset(wszPathName, 0, sizeof(wszPathName));
MultiByteToWideChar(CP_ACP, 0, url, strlen(url) + 1, wszUrlName,
sizeof(wszUrlName) / sizeof(wszUrlName[0]));
MultiByteToWideChar(CP_ACP, 0, url, strlen(url) + 1, wszPathName,
sizeof(wszPathName) / sizeof(wszPathName[0]));


//首先获取资源文件的信息
HINTERNET internetOpen = InternetOpen(NULL, INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (internetOpen == NULL)
return FALSE;
//打开连接
HINTERNET internetOpenUrl = InternetOpenUrl(internetOpen, wszUrlName, NULL, 0, INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_PRAGMA_NOCACHE, 0);
if (internetOpenUrl == NULL)
{
InternetCloseHandle(internetOpen);
return FALSE;
}
//检查状态码
DWORD dwStatusCode;
DWORD dwStatusSize = sizeof(dwStatusCode);
HttpQueryInfo(internetOpenUrl, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER, &dwStatusCode, &dwStatusSize, NULL);
if (dwStatusCode != 200)
{
InternetCloseHandle(internetOpenUrl);
InternetCloseHandle(internetOpen);
return FALSE;
}
//获取接收数据大小
DWORD m_iSize;
DWORD dwLengthSize = sizeof(m_iSize);
HttpQueryInfo(internetOpenUrl, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, &m_iSize, &dwLengthSize, NULL);
if (m_iSize < 0)
{
InternetCloseHandle(internetOpenUrl);
InternetCloseHandle(internetOpen);
return FALSE;
}
//创建本地文件
//HANDLE createFile = CreateFile(wszPathName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//HANDLE createFile = CreateFile(newLocalPathName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
HANDLE createFile = CreateFile(newLocalPathName, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
//如果本地文件是个无效的句柄 则就结束
if (createFile == INVALID_HANDLE_VALUE)
return FALSE;
//执行读取数据
char buffer[100000];
memset(buffer, 0, sizeof(buffer));
DWORD byteRead = 0;
BOOL hwrite;
DWORD written;
int a = 0;
if (internetOpenUrl != NULL)
{
while (true)
{
InternetReadFile(internetOpenUrl, buffer, sizeof(buffer), &byteRead);
if (byteRead == 0)//读取完毕
break;
hwrite = WriteFile(createFile, buffer, byteRead, &written, NULL);
if (hwrite == 0)//写入失败
break;
}
}
//下载完毕关闭连接
InternetCloseHandle(internetOpenUrl);
InternetCloseHandle(internetOpen);


return TRUE;
}


void main()
{
if (DownloadFileAndSaveToLocal1("http://www.baidu.com/", "D:\\abc\\index4.html"))
{
cout << "成功了!" << endl;
}
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值