【问题标题】:Progress bar on file uploading via FTP [C++]通过 FTP 上传文件的进度条 [C++]
【发布时间】:2012-08-05 14:33:51
【问题描述】:

我编写了一个小程序,它能够通过 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() 来计算字节上传之前(不是确定这是否可能)。

【问题讨论】:

    标签: c++ ftp progress-bar


    【解决方案1】:

    你想:

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

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

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

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

    【讨论】:

    • 感谢您的回复杰瑞。您能否详细说明最后一段?从文件中读取一个数据缓冲区后,如何记住文件中的位置(所以我不会多次发送相同的数据)?
    • @Rob:嗯,你基本上会有一个正常的循环来读取一个块,然后把它写出来,直到你到达文件的末尾。除非您正在执行重叠读取,否则您不需要明确记住文件位置 - 您可以使用(例如)std::istream::tellg 检索它。
    【解决方案2】:

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

    我的意思是:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 2012-04-26
      • 2013-03-24
      • 1970-01-01
      相关资源
      最近更新 更多