2

我编写了一个小程序,它能够通过 ftp 将文件上传到服务器。由于某些文件很大,我想为用户创建一个进度条。因此,在上传期间,我需要每隔一定时间知道有多少字节已发送到服务器,以便得出已上传文件的百分比。到目前为止我已经尝试过:

当我调用函数 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() 上传之前计算字节数(不确定这是否可能)。

4

2 回答 2

2

你想要:

  1. 调用InternetSetStatusCallback设置在传输期间将定期调用的函数。
  2. 将最后一个参数的(非零)值传递给FtpOpenFile. 这将在传输期间传递回您的状态回调函数。

然后,在 FTP 操作期间,将定期调用您的回调函数,其中包含有关传输进度的信息,然后它可以向用户显示这些信息。

我不相信这会让您在传输时显示实际字节 - 如果内存服务它主要显示传输中的离散步骤,例如打开句柄,解析名称,发送/接收 cookie,最后关闭手柄。

为了处理在文件本身传输期间写入的实际字节,您通常会从本地文件中读取一个充满数据的缓冲区,然后使用InternetWriteFile. 这样,您可以将传输的百分比计算为到目前为止写入的字节数除以文件的总大小(然后乘以 100)。

于 2012-08-05T15:17:22.390 回答
0

好吧,我通过分块发送文件并更新进度而不是通过一次调用发送整个文件来解决了这样的问题FtpPutFile

我是说:

 FtpOpenFile(...)
 for( ... )
 {
    InternetWriteFile(... dwChunkSize...)
    UpdateProgressBar(dwChunkSize)        
 }
 InternetCloseHandle(...)
于 2012-08-05T15:44:11.900 回答