用C++实现下载文件的功能
今天同学问了个C++实现给定的下载链接进行下载并保存文件,上网搜索下,看到网上这类东西,所以就直接拿来个改了下,因为他的代码是在VC++中可以,我导入到VS2010中出现点小问题,所以改了下贴了个VS中亲测可运行的代码。在此记录下。
参考的资料 http://bbs.csdn.net/topics/390052882 感觉里面大家讨论的都不错
其实这个使用到MFC中的一些函数,可以做成图形界面的。
下面贴下自己小小修改的代码
//#define _WIN32_WINNT 0x0502 #include <afx.h> #include <afxinet.h> #include <iostream> using namespace std; #define RECVPACK_SIZE 2048 bool DownloadSaveFiles(const char* url,const char* strSaveFile) {//下载文件并保存为新文件名 bool ret=false; CInternetSession Sess(_T("lpload")); Sess.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT , 5000); //5秒的连接超时 Sess.SetOption(INTERNET_OPTION_SEND_TIMEOUT , 5000); //5秒的发送超时 Sess.SetOption(INTERNET_OPTION_RECEIVE_TIMEOUT , 5000); //5秒的接收超时 Sess.SetOption(INTERNET_OPTION_DATA_SEND_TIMEOUT , 5000); //5秒的发送超时 Sess.SetOption(INTERNET_OPTION_DATA_RECEIVE_TIMEOUT, 5000); //5秒的接收超时 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((CString)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; //cout << "nLen=" << nLen << endl; if (nLen <= 0) break;// //分配接收数据缓存 pBuf = (char*)malloc(nLen+8); ZeroMemory(pBuf,nLen+8); char *p=pBuf; while (nLen>0) { //每次下载8K int n = cFile->Read(p,(nLen<RECVPACK_SIZE)?nLen:RECVPACK_SIZE); //接收完成退出循环 if (n <= 0) break;// //接收缓存后移 p+= n ; //剩余长度递减 nLen -= n ; //cout << "nLen=" << nLen << endl; } //如果未接收完中断退出 if (nLen != 0) break; //接收成功保存到文件 CFile file((CString)strSaveFile, CFile::modeCreate | CFile::modeWrite); file.Write(pBuf,nBufLen); file.Close(); ret = true; } } catch(...) { cout << "异常" << endl; break;// } } while(0); //释放缓存 if (pBuf) { free(pBuf); pBuf=NULL; nBufLen = 0 ; } //关闭下载连接 if (cFile) { cFile->Close(); Sess.Close(); delete cFile; } return ret; } int main() { //测试用例 if(DownloadSaveFiles("http://www.nirsoft.net/utils/nircmd.zip","d:/cppdld_nircmd.zip") == true) { cout << "下载成功" << endl; }else{ cout << "下载失败"<< endl; } return 0; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。