一、使用MFC winhttp下载
#include
#include
#define RECVPACK_SIZE 2048
bool DownloadSaveFiles(char* url,char *strSaveFile) {//下载文件并保存为新文件名
bool ret=false;
CInternetSession Sess("lpload");
Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT , 2000); //2秒的连接超时
Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT , 2000); //2秒的发送超时
Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT , 2000); //2秒的接收超时
Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT , 2000); //2秒的发送超时
Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 2000); //2秒的接收超时
DWORD dwFlag = INTERNET_FLAG_TRANSFER_BINARY|INTERNET_FLAG_DONT_CACHE|INTERNET_FLAG_RELOAD ;
CHttpFile* cFile = NULL;
char *pBuf = NULL;
int nBufLen = 0 ;
do {
try{
cFile = (CHttpFile*)Sess.OpenURL(url,1,dwFlag);
DWORD dwStatusCode;
cFile->QueryInfoStatusCode(dwStatusCode);
if (dwStatusCode == HTTP_STATUS_OK) {
//查询文件长度
DWORD nLen=0;
cFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH, nLen);
//CString strFilename = GetFileName(url,TRUE);
nBufLen=nLen;
if (nLen 0) {
//每次下载8K
int n = cFile->Read(p,(nLen 0)
{
InternetReadFile(handle2, Temp, MAXBLOCKSIZE - 1, &Number);
fwrite(Temp, sizeof(char), Number, stream);
}
fclose(stream);
}
InternetCloseHandle(handle2);
handle2 = NULL;
}
InternetCloseHandle(hSession);
hSession = NULL;
}
}
三、使用Windows提供的urlmon库
#include
#include
#include
#include
#include
#include
#pragma comment(lib, "urlmon.lib")
using namespace std;
BOOL FileExistsStatus(const CHAR* path)
{
DWORD dwAttribute = GetFileAttributes(path);
if (dwAttribute == 0XFFFFFFFF) return false; //0XFFFFFFFF表示文件不存在
else return true;
}
BOOL DownloadFiles(const CHAR* url, const CHAR* downloadPath)
{
if (URLDownloadToFile(NULL, url, downloadPath, 0, 0) == S_OK && FileExistsStatus(downloadPath)) return true;
else return false;
}
int main(int argc, char* argv[])
{
if (DownloadFiles(argv[1], argv[2])) printf("OK!\n");
else printf("Error!\n");
return 0;
}