使用CInternetSession CHttpFile下载网页链接地址的文件
思路很清晰,使用CInternetSession创建CHttpFile对象。然后对该对象获取文件信息、进行文件读写操作均可。
void DownloadFile(LPCTSTR szURL, LPCTSTR szFile) //szURL 表示网页地址 szFile 表示保存本地的路径(及要保存的文件名) 感谢网友oceansoft http://blog.chinaunix.net/uid-7718934-id-2564609.html分享 { DWORD dwFlag = //设置读取的方式 INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_RELOAD; CInternetSession cis; CHttpFile* pFile = (CHttpFile*)cis.OpenURL(szURL, 1, dwFlag); //创建CHttpFile对象
if(pFile) { DWORD dwStatusCode; pFile->QueryInfoStatusCode(dwStatusCode); //获得HTTP响应请求的状态 CString dwFileLength;//这段代码是自己测试使用,获取请求文件的大小,单位是kb
pFile->QueryInfo(HTTP_QUERY_CONTENT_LENGTH,dwFileLength); int length = atoi(dwFileLength)/1024; if(dwStatusCode == 200) //200 表示 网页地址正常响应 { CString str; CFile cf; //创建CFile对象 if(!cf.Open(szFile, CFile::modeWrite|CFile::modeCreate)) //该目录是否有权限打开,如果打开失败就直接返回 return; char lpBuf[4096];//每次读取文件的大小 为4kb UINT dwRead = 0, dwFileLen = 0; do { dwRead = pFile->Read(lpBuf, sizeof(lpBuf)); //每次读取 4096 B = 1024 * 4 B = 4kb的内容 dwRead 为实际读写的大小 if(dwRead > 0) { cf.Write(lpBuf, dwRead); //写入文件 dwFileLen += dwRead; //dwFileLen表示实际下载的大小 } }while(dwRead > 0); cf.Close(); //关闭打开的资源 } pFile->Close(); delete pFile; } }
OpenURL函数原型如下:
CStdioFile* OpenURL( LPCTSTR pstrURL, //下载的地址 DWORD_PTR dwContext = 1, //An application-defined value passed with the returned handle in callback. (具体是啥,还不用过,翻译就是在回调时返回的自定义值,英语各种水,就用它默认的值1) DWORD dwFlags = INTERNET_FLAG_TRANSFER_ASCII, //设置传输的方式有很多 具体见 http://msdn.microsoft.com/zh-cn/library/d25ew7sy(v=VS.80).aspx LPCTSTR pstrHeaders = NULL, DWORD dwHeadersLength = 0 );
返回值有很多类型使用强制转换就可以了,我们使用的是CHttpFile
URL type | Returns |
---|---|
file:// |
CStdioFile* |
http:// |
CHttpFile* |
gopher:// |
CGopherFile* |
ftp:// |
CInternetFile* |
测试的函数调用为DownloadFile("http://dldir1.qq.com/qqfile/qq/QQ2013/QQ2013SP6/9305/QQ2013SP6.exe", "E:\\程序\\C++测试\\tttt\\tttt\\QQ2013SP6.exe");