我写了一个小程序,可以通过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 <
但是,这似乎不起作用,因为文件大小不断返回值-1。我认为这是由于以下事实:我正在写入文件(上传部分),并且同时试图读取文件以获取文件大小。我认为这是不可能的(如果我错了,请纠正我)。
我的主要问题:还有其他方法可以创建用于ftp上传的进度条吗?也许在使用函数readBytesCount()上传之前对字节进行计数(不确定是否可以这样做)。
你想要:
调用InternetSetStatusCallback设置将在传输期间定期调用的函数。
将最后一个参数(非零)值传递给FtpOpenFile。这将在传输过程中传递回状态回调函数。
然后,在FTP操作期间,将定期使用有关传输进度的信息调用回调函数,然后将其显示给用户。
我认为这不会让您在传输实际字节时显示它们-如果内存服务它主要显示传输中的离散步骤,例如打开句柄,解析名称,发送/接收Cookie并最终关闭手柄。
为了处理在文件本身传输过程中写入的实际字节,通常需要从本地文件读取充满数据的缓冲区,然后使用InternetWriteFile写入该缓冲区。这样,您可以计算出的传输百分比,即到目前为止已写入的字节数除以文件的总大小(再乘以100)。
感谢您的回复,杰里。 您能否详细说明最后一段? 从文件中读取数据缓冲区后,如何记住文件中的位置(因此我不会多次发送相同的数据)?
@Rob:好吧,基本上,您将有一个正常的循环来读取一个块,然后将其写出,直到到达文件末尾为止。 除非您进行重叠的读取,否则您无需明确记住文件位置-您只需使用std::istream::tellg进行检索即可。
知道了,再次感谢!
好吧,我通过分块发送文件并更新进度来代替通过一次调用FtpPutFile的方式发送整个文件来解决此问题。
我的意思是:
FtpOpenFile(...)
for( ... )
{
InternetWriteFile(... dwChunkSize...)
UpdateProgressBar(dwChunkSize)
}
InternetCloseHandle(...)