程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 用任務條跟蹤文件下載

用任務條跟蹤文件下載

編輯:關於C++

注意:本文代碼不是最快的和最有效的代碼。我有一套更快的代碼。希望你在閱讀本文之後能編寫出自己的高效代碼。

概要

程序用線程管理下載過程,這樣主程序就不會被封閉,程序還有中止下載的功能。下載過程在線程中單獨進行,並隨時刷新屏幕上的任務條狀態。

創建下載文件:

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;

這裡簡單敘述了用任務條跟蹤文件下載的基本過程。其它如出錯處理等詳情可閱讀附件程序。

希望本文有助於理解從網上下載文件的各個環節。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved