日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

vc:如何从Internet上有效而稳定地下载文件

發布時間:2025/3/15 c/c++ 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vc:如何从Internet上有效而稳定地下载文件 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

http://www.vckbase.com/index.php/wv/172

如何從Internet上有效而穩定地下載文件 ,這是很多網絡應用程序要考慮的重要問題,本文提供的代碼段針對這個問題進行了初步的探索。希望能夠拋磚引玉,對各位編程人員有所幫助。

1.UINT?InternetGetFile (HINTERNET IN hOpen, 2.CHAR?*szUrl, 3.CHAR?*szFileName, 4.HWND?hwndProgress, 5.int?idStatusText, 6.int?idProgressBar);

這里返回值的類型為UINT,如果成功返回0,否則返回非零值。為了使用這個函數,只需要提供一個有效的HINTERNET句柄,這個句柄可以通過標準的InternetOpen()掉用來獲得。如果你愿意的話,你還可以將一個句柄提供給進度窗口(ID為一靜態控制的標示符,用來顯示狀態),在這個函數的頭幾行代碼中聲明一些變量。

1.DWORD?dwSize;

這個變量被用于存儲每次調用InternetReadFile讀取了多少數據。

1.CHAR?szHead[] =?"Accept: */*\r\n\r\n";

用于存儲多個HTTP頭信息。如果在調用InternetOpenUrl時不傳遞著個頭信息,則只允許你打開文本文件!

1.VOID* szTemp[16384];

緩沖變量,可以存儲來自Internet的16KB的文件數據。

1.HINTERNET hConnect;

這是一個HINTERNET句柄,包含請求結果(來自InternetOpenUrl)

1.FILE?* pFile;

標準的C文件句柄(必須包含stdio.h)。如果你愿意,可以使用Win32處理文件的API?

1.if?(!(hConnect = InternetOpenUrlA (hOpen, szUrl, szHead, lstrlenA (szHead), INTERNET_FLAG_DONT_CACHE | INTERNET_FLAG_PRAGMA_NOCACHE | INTERNET_FLAG_RELOAD, 0))) 2.{ 3.return?INTERNET_ERROR_OPENURL; 4.}

?此調用可以打開一個使用URL的Internet文件句柄。標志表示這個文件總是被讀取,而不是緩存(cache)。如果失敗,則此函數返回錯誤,你可以給定INTERNET_ERROR_OPENURL任何值。必須為這個函數定義所有的錯誤信息。也可以用一個數字替代。

1.if(!(pFile =?fopen(szFileName,?"wb"?))) 2.{ 3.return?INTERNET_ERROR_FILEOPEN; 4.}

此調用根據給定的文件名打開文件。如果失敗則返回另一個用戶定義的錯誤。

1.DWORD?dwByteToRead = 0; 2.DWORD?dwSizeOfRq = 4; 3.DWORD?dwBytes = 0;

這三個值分別存儲文件的大小,HttpQueryInfo內容的大小和總共讀取的字節數。?

1.if?(!HttpQueryInfo(hConnect, HTTP_QUERY_CONTENT_LENGTH | HTTP_QUERY_FLAG_NUMBER, (LPVOID)&dwByteToRead, &dwSizeOfRq, NULL)) 2.{ 3.dwByteToRead = 0; 4.}

此調用可以獲得文件的大小。如果失敗則dwByteToRead被置為0,并且當文件被下載時不會顯示百分比和總數

1.DWORD?start; 2.DWORD?end; 3.DWORD?time; 4.time?= 10; 5.start = timeGetTime();

使用這些bit必須包含mmsystem.h并鏈接winmm.lib,它們用于時間選擇,告訴用戶下載的速度。例子代碼只統計了下載速度,你可以擴展這個功能,比如估計還剩多少時間。

1.do 2.{ 3.if?(!InternetReadFile(hConnect, szTemp, 16384, &dwSize)) 4.{ 5.fclose?(pFile); 6.return?INTERNET_ERROR_READFILE; 7.}

此調用循環中,每次下載一個16KB的數據塊。如果download請求失敗,則文件被關閉并返回錯誤。

1.if?(!dwSize) 2.break; 3.else 4.fwrite(szTemp,?sizeof(char), dwSize, pFile);

如果dwSize為0,則意味著一個EOF,循環退出。否則由InternetReadFile讀取的數據內容被寫到本地文件中。

這個代碼中,dwBytes是從文件讀取的數據量,它不斷增加,如果文件長度是有效的,則進度窗口句柄被指定,進度條被更新已表示下載進度。

這些bit代碼用于根據所花時間計算下載速度和讀取的數據量。

1.if(hwndProgress) 2.{ 3.char?s[260]; 4.sprintf(s,?"%d KB / %d KB @ %1.1f KB/s", dwBytes/1024, dwByteToRead/1024, fSpeed); 5.SetDlgItemTextA(hwndProgress, idStatusText, s); 6.UpdateWindow(hwndProgress); 7.}

設置和處理進度窗口的狀態文本,表示下載的文件大小和下載速度。

1.end = timeGetTime(); 2.time?= end - start; 3.if(time?== 0) 4.time?= 10;

時間被更新

1.}?// do 2.while?(TRUE);

循環結束

1.fflush?(pFile); 2.fclose?(pFile); 3.return?0; 4.}<.pre>

最后,函數結束,關閉文件并清除硬件驅動的緩沖。返回0表示成功。

使用這個代碼段,按照本文所描述的那樣,你可以自己編寫一個程序來從Internet上有效地、穩定地下載文件。實現細節請參見例子。

轉載于:https://www.cnblogs.com/carl2380/p/3528334.html

總結

以上是生活随笔為你收集整理的vc:如何从Internet上有效而稳定地下载文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。