我想第一次使用QFtp,并在谷歌上搜索了很多以了解应该如何使用它。这是一个典型的例子:
#include <QCoreApplication>
#include <QFtp>
#include <QFile>
int main(int argc, char ** argv)
{
QCoreApplication app(argc, argv);
QFile *file = new QFile( "C:\Devel\THP\tmp\test.txt" );
file->open(QIODevice::ReadWrite);
QFtp *ftp = new QFtp();
ftp->setTransferMode(QFtp::Active);
ftp->connectToHost("ftp.trolltech.com");
ftp->login();
ftp->cd("qt");
ftp->get("INSTALL",file);
ftp->close();
QObject::connect(ftp, SIGNAL(done(bool)), &app, SLOT(quit()));
int ret = app.exec();
delete ftp;
delete file;
return ret;
}
问题:
据我所知,QCoreApplication应用程序需要处理"完成"信号,在ftp get完成时发出。现在,ftp->get
在连接之前调用,甚至在应用程序处理程序运行之前调用(之后调用app.exec())。
如果文件传输在"connect"语句之前已经完成,会发生什么?事实上,这不会发生,但我可以在ftp->close()
和connect(…)之间设置一个人为的延迟,比如1分钟。在此期间,ftp get肯定会完成。会发生什么?
请注意,QFtp实际上只适用于遗留的Qt应用程序,现在建议使用QNetworkAccessManager和QNetworkReply,如Qt文档中所述。
也就是说,在连接到FTP站点并检索文件之后,将定位您的连接调用,如果首先下载文件,则永远不会收到"退出"信号。如果您在创建QFtp对象后直接进行连接,那么这不会是一个问题:-
QFtp *ftp = new QFtp();
QObject::connect(ftp, SIGNAL(done(bool)), &app, SLOT(quit()));
这保证了当QFtp对象发出"完成"信号时,将调用"退出"槽。
QFtp *ftp = new QFtp();
QObject::connect(ftp, SIGNAL(done(bool)), &app, SLOT(quit()));
ftp->setTransferMode(QFtp::Active);
ftp->connectToHost("ftp.trolltech.com");
ftp->login();
ftp->cd("qt");
ftp->get("INSTALL",file);
ftp->close();
int ret = app.exec();
然而,在现实中,我希望您的示例中的连接会在机器有时间协商与另一台服务器的连接、登录并开始下载文件之前完成。