当前位置: 代码迷 >> QT开发 >> 调用FTP下载文件失败解决办法
  详细解决方案

调用FTP下载文件失败解决办法

热度:109   发布时间:2016-04-25 03:17:16.0
调用FTP下载文件失败
这是一个C++ GUI QT4编程中的ftp例子,它实现了从ftp下载一个文件的功能。我在使用这个例子的时候出现了一个匪夷所思的问题。当我在main函数中调用getFile()时,可以正确下载到文件。但是当我在MainWindow中调用getFile()时却不行,根本就没有连接上ftp。请问如何解释这个问题?会不会是构造函数中 : QObject(parent)的问题?

ftpget的源代码附上。


ftpget.h
#ifndef FTPGET_H
#define FTPGET_H

#include <QFile>
#include <QFtp>

class QUrl;

class FtpGet : public QObject
{
    Q_OBJECT

public:
    FtpGet(QObject *parent = 0);

    bool getFile(const QUrl &url);

signals:
    void done();

private slots:
    void ftpDone(bool error);

private:
    QFtp ftp;
    QFile file;
};

#endif



#include <QtCore>
#include <QtNetwork>
#include <iostream>

#include "ftpget.h"

FtpGet::FtpGet(QObject *parent)
    : QObject(parent)
{
    connect(&ftp, SIGNAL(done(bool)), this, SLOT(ftpDone(bool)));
}

bool FtpGet::getFile(const QUrl &url)
{
    QString localFileName = QFileInfo(url.path()).fileName();
    if (localFileName.isEmpty())
        localFileName = "ftpget.out";

    file.setFileName(localFileName);
    if (!file.open(QIODevice::WriteOnly)) {
        std::cerr << "Error: Cannot write file "
                  << qPrintable(file.fileName()) << ": "
                  << qPrintable(file.errorString()) << std::endl;
        return false;
    }

    ftp.connectToHost(url.host(), url.port(21));
    ftp.login();
    ftp.get(url.path(), &file);
    ftp.close();
    return true;
}

void FtpGet::ftpDone(bool error)
{
    if (error) {
        std::cerr << "Error: " << qPrintable(ftp.errorString())
                  << std::endl;
    } else {
        std::cerr << "File downloaded as "
                  << qPrintable(file.fileName()) << std::endl;
    }
    file.close();
    emit done();
}



------解决方案--------------------
QFtp 的很多方法 都是非阻塞的,你这样的使用 可能会出现文件还没有下载到就关闭FTP 的情况。 
------解决方案--------------------
兄弟,你MainWindow中是在使用局部变量来下载!
函数结束FtpGet就析构了。哪还能下载得下来呢?new一个 FtpGet 就可以了。
void MainWindow::on_Z_D_action_triggered()
{
    FtpGet getter;
    getter.getFile(QUrl("ftp://21.179.232.60/home/wj/Projects/Restruction/xuzhaohe/D3100/caliberation_result.txt"));
}
  相关解决方案