4
    QNetworkAccessManager *nam = new QNetworkAccessManager();
    QUrl url2("ftp://127.0.0.1/test.txt/");
    url2.setPassword("12345");
    url2.setUserName("user");
    QNetworkRequest req(url2);


   QNetworkReply *reply = nam->get(req);
   QByteArray data = reply->readAll() ;
   qDebug() << data ;

ローカルの ftp サーバーに接続してファイルを読み取りますが、ガベージが発生します。何が間違っていますか??

4

1 に答える 1

5

get() は GET リクエストをすぐに同期的に実行するのではなく、QNetworkReplyオブジェクトを作成するだけで、実際のリクエストは後で非同期的に実行されます。

readAll()特定の時点で利用可能なデータのみを読み取りますが、さらにデータを待つためにブロックしません。作成直後は、利用可能なデータはありません。

すべてのデータがダウンロードされるのを待つには、finished()およびerror()シグナルに接続します。

connect(reply, SIGNAL(finished()), this, SLOT(requestFinished()));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), SLOT(requestError(QNetworkReply::NetworkError));

その後、requestFinished()スロットで を使用できますreadAll()。小さなファイルのみをダウンロードする場合は問題ありません。より大きなファイルをダウンロードする場合は、readyRead()シグナルに接続し、最後に単一のチャンクを使用するのではなく、到着したデータを増分チャンクで処理することをお勧めしますreadAll()

于 2013-07-15T18:49:01.293 に答える