用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;
}
相關文章
- Flutter 實現檔案下載功能Flutter
- Java實現檔案下載功能Java
- Django 實現下載檔案功能Django
- Android實現zip檔案下載和解壓功能Android
- Weex 實現檔案的下載
- 教你如何實現c#檔案上傳下載功能C#
- Flutter實現檔案下載Flutter
- AJAX實現檔案下載----
- js下載檔案的實現方式JS
- 【python】用python指令碼實現ansible的推送、下載、上傳檔案功能Python指令碼
- servlet實現檔案下載demoServlet
- 利用IhttpHandler實現檔案下載HTTP
- 使用Servlet實現檔案下載Servlet
- jsp下載檔案的實現方法JS
- java實現檔案的下載的方法概述Java
- 【轉】c++ http下載檔案C++HTTP
- js實現txt/excel檔案下載JSExcel
- Java程式碼實現下載檔案Java
- vc實現https檔案下載HTTP
- servlet實現下載功能Servlet
- java實現sftp檔案的上傳下載JavaFTP
- ASP.NET檔案下載的實用方法ASP.NET
- 檔案上傳和下載功能
- vue/js實現檔案流下載,檔案下載進度監聽VueJS
- 用java實現基於http協議的網路檔案下載JavaHTTP協議
- Feign實現檔案上傳下載
- PowerShell實現檔案下載(類wget)wget
- 如何實現java檔案佇列下載Java佇列
- Javascript 實現一個post方式的檔案下載JavaScript
- vue實現Excel檔案的上傳與下載VueExcel
- Visual C++實現檔案間批次轉換功能 (轉)C++
- iis實現點選檔案下載而不是開啟檔案
- javaWeb不生成臨時檔案實現壓縮檔案下載JavaWeb
- 驚了!7 行程式碼優雅地實現 Excel 檔案生成&下載功能行程Excel
- 前端實現檔案下載和拖拽上傳前端
- Android 中 DownLoadManager 實現檔案下載Android
- SpringMVC實現檔案上傳&下載(2)SpringMVC
- 也用 C++ 實現 Property 功能 (轉)C++