2012-08-05 107 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(...)