1

初めて QFtp を使用したいと思い、Google でよく検索して、どのように使用すればよいかを調べました。これは、特に典型的な例です。

#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;
}

質問:

私が理解している限り、ftp-get のファイナライズ時に発行される「完了」シグナルを処理するには、QCoreApplication アプリが必要です。これで、ftp->get接続前、さらにはアプリ ハンドラーが実行される前に呼び出されます (後で app.exec() が呼び出されます)。

"connect" ステートメントの前にファイル転送が既に完了している場合はどうなりますか? ftp->close()実際にはそうはなりませんが、connect(...) との間にたとえば 1 分間の人為的な遅延を入れることができます。この間、ftp get は確実に終了します。何が起こるでしょうか?

4

1 に答える 1

0

QFtp は実際にはレガシー Qt アプリケーションのみを対象としており、 Qt のドキュメントで詳しく説明されているように、代わりにQNetworkAccessManagerQNetworkReplyを使用することをお勧めします。

そうは言っても、接続呼び出しが 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 に答える