注意:本文代碼不是最快的和最有效的代碼。我有一套更快的代碼。希望你在閱讀本文之後能編寫出自己的高效代碼。
概要
程序用線程管理下載過程,這樣主程序就不會被封閉,程序還有中止下載的功能。下載過程在線程中單獨進行,並隨時刷新屏幕上的任務條狀態。
創建下載文件:
CInternetSession netSession;
CStdioFile *file;
file = netSession.OpenURL(char url,1,INTERNET_FLAG_TRANSFER_BINARY | INTERNET_FLAG_RELOAD);
函數創建一個CStdioFile類型的文件指針,文件存放在本地硬盤。注意有的服務器可能要求文件的讀寫許可。
文件的讀寫:
file- >Read(char buffer,int bytes to read);
CFile fl;
fl.Open( "myfile ",CFile::modeCreate | CFile::modeWrite | CFile::typeBinary);
fl.Write(buffer,bytes read);
任務條,數據傳送及其它
任務條用CProgressCtrl::SetRange32(); 函數,它有最小值和最大值二個參數。最小值是0,最大值是文件大小。文件的大小可用下面函數獲得:
int x = file- >SeekToEnd();
::SeekToEnd()函數返回文件的所有字節數,即文件大小。
讀取一個文件數據包就刷新一次任務條。文件數據包為512字節,這樣不會阻塞連接。也就是執行一次file- >Read()函數就刷新一次任務條:
while(int bytesread = file- >Read(charbuf,512))
{
currentbytes = currentbytes + bytesread;
CProgressCtrl::SetPos(currentbytes);
}
以下代碼計算下載字節數,百分比和下載速度(kb/sec):
int percent = currentbytes * 100 / x (文件大小);
int kbreceived = currentbytes / 1024;
在進入文件下載的循環體前先創建一個COleDateTime對象並設置下載起始時間,然後聲明一個變量(double)來存放下載過程中的時間與起始時間的時間差(單位是秒):
COleDateTime dlStart = COleDateTime::GetCurrentTime();
double secs;
在下載循環體內用COleDateTimeSpan對象來計算下載花費的時間(秒):
COleDateTimeSpan dlElapsed = COleDateTime::GetCurrentTime() - dlStart;
secs = dlElapsed.GetTotalSeconds();
將接收到的字節數除以花費時間即可得下載速率:
double kbsec = kbreceived / secs;
這裡簡單敘述了用任務條跟蹤文件下載的基本過程。其它如出錯處理等詳情可閱讀附件程序。
希望本文有助於理解從網上下載文件的各個環節。