1

我想第一次使用 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 肯定会完成。会发生什么?

4

1 回答 1

0

请注意,QFtp 实际上仅适用于遗留 Qt 应用程序,现在建议使用QNetworkAccessManagerQNetworkReply,如Qt 文档中所述。

话虽如此,由于您的连接调用位于连接到 FTP 站点并检索文件之后,如果首先下载文件,则永远不会达到“退出”信号。如果您在创建 QFtp 对象后直接建立连接,那么这将不是问题:-

QFtp *ftp = new QFtp();
QObject::connect(ftp, SIGNAL(done(bool)), &app, SLOT(quit()));

这保证了当 QFtp 对象发出 'done' 信号时将调用 'quit' 槽。

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();

但实际上,我希望您的示例中的连接将在机器有时间协商与另一台服务器的连接、登录并开始下载文件之前完成。

于 2015-03-24T13:32:52.107 回答