通过FTP上传文件的进度条[C ++]

时间:2012-08-05 14:33:52

标签: c++ ftp progress-bar

我写了一个小程序,可以通过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; 

然而,这似乎不起作用,因为 filesize 不断返回值-1。我认为这是因为我正在写一个文件(上传部分),同时我试图读取它来获取文件大小。而且我认为这是不可能的(如果我错了,请纠正我。)

我的主要问题:是否有另一种方法可以为ftp上传创建进度条?也许使用函数readBytesCount()计算之前>的字节数(不是确定这是否可行。)

2 个答案:

答案 0 :(得分:2)

你想要:

  1. 调用InternetSetStatusCallback设置将在传输过程中定期调用的函数。
  2. 将最后一个参数的(非零)值传递给FtpOpenFile。这将在传输过程中传递回状态回调函数。
  3. 然后,在FTP操作期间,您的回调函数将定期调用有关传输进度的信息,然后可以显示给用户。

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

    要处理在文件传输过程中写入的实际字节,通常从本地文件中读取缓冲区中的数据,然后使用InternetWriteFile写入该缓冲区。这样,您可以计算传输的百分比作为到目前为止写入的字节数除以文件的总大小(并乘以100)。

答案 1 :(得分:0)

好吧,我解决了这个问题,方法是通过块发送文件并通过一次调用更新代替发送整个文件的进度FtpPutFile

我的意思是:

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