C++下载文件到本地

#include 
#include 
#include  
#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;
}
}

你可能感兴趣的:(C++)