2012-08-05 98 views
2

我寫了一個小程序,它能夠通過FTP上傳文件到服務器。由於我想爲用戶創建一個進度條,因此需要大量的文件。因此,在上傳過程中,我需要知道爲了獲取已上傳文件的百分比,已經向服務器發送了多少字節。什麼到目前爲止,我曾嘗試:進度條[C++]

雖然我調用函數FtpPutFile()上傳的文件,我產生一個線程用下面的代碼:

hInternet = InternetOpen(NULL,INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0); 
hFtpSession = InternetConnect(hInternet, ftpserver, port, user, pass, INTERNET_SERVICE_FTP, 0, 0); 
int filesize = 0; // 2GB max 

hFile = FtpOpenFile(hFtpSession,szFileTitle,GENERIC_READ,FTP_TRANSFER_TYPE_BINARY,0); 
filesize = FtpGetFileSize(hFile,0); 
cout << "Size: " << filesize << endl; 

然而,這似乎並不工作文件大小保持返回值-1。我認爲這是由於我正在寫一個文件(上傳部分),同時我正在嘗試讀取它以獲取文件大小。我認爲這是不可能的(如果我錯了,請糾正我)。

我的主要問題:有另一種方式來創建FTP上傳進度條?也許計數字節之前他們使用的功能readBytesCount()(不知道這是可能的),上傳的照片。

回答

2

您希望:

  1. 呼叫InternetSetStatusCallback設定,將定期在傳輸過程中被調用的函數。
  2. 傳遞一個(非零)值的最後一個參數FtpOpenFile。這將在傳輸過程中傳遞迴您的狀態回調函數。

然後,在FTP操作過程中,您的回調函數將定期調用有關傳輸進度的信息,然後可以將其顯示給用戶。

我不相信這會讓你展示實際字節數,他們被轉移,雖然 - 如果沒有記錯它主要顯示在傳輸不連續的步驟,就像打開手柄,解析名稱,發送/接收餅乾,最後關閉手柄。

要處理文件本身傳輸過程中寫入的實際字節,通常需要從本地文件讀取緩衝區滿的數據,然後用InternetWriteFile寫入該緩衝區。通過這個,你可以計算傳輸的百分比,作爲目前寫入的字節數除以文件總大小(乘以100)。

+0

感謝您的答覆傑瑞。你能否詳細說明最後一段?從文件中讀取數據緩衝區後,如何記住文件中的位置(所以我不會多次發送相同的數據)? – Rob 2012-08-05 16:14:03

+0

@Rob:好了,你基本上將有一個正常的循環讀取塊,然後將它寫出來,直到你到達文件的末尾。除非你做重疊讀取,否則你不需要明確地記住文件的位置 - 你可以用(例如)'std :: istream :: tellg'來檢索它。 – 2012-08-05 16:19:48

+0

明白了,再次感謝! – Rob 2012-08-05 17:50:36

0

嗯,我由塊發送的文件,並通過一個呼叫更新,而不是發送整個文件的進度FtpPutFile

解決這樣的問題,我的意思是:

FtpOpenFile(...) 
for(...) 
{ 
    InternetWriteFile(... dwChunkSize...) 
    UpdateProgressBar(dwChunkSize)   
} 
InternetCloseHandle(...)