从Ftp问题下载多个文件

时间:2018-04-03 15:55:58

标签: c++ qt windows-applications

我想从我的ftp服务器下载一些文件。问题是,只有最后一个有数据,其他0大小,或者当关闭QFile作为指针时崩溃。

我的代码:

QFtp *ftp = new QFtp(this);
ftp->connectToHost(FTP_HOST, FTP_PORT);
ftp->login(FTP_USERNAME, FTP_PASSWORD);
QFile *reportFile = nullptr;

connect(ftp, &QFtp::listInfo, [this](const QUrlInfo &ftpUrlInfo) {
        if (ftpUrlInfo.isFile()) {
            reportFile = new QFile("some local path" + ftpUrlInfo.name());
            reportFile->open(QIODevice::WriteOnly);
            ftp->get("some ftp path" + ftpUrlInfo.name(), reportFile, QFtp::Binary);
        }
    });
connect(ftp, &QFtp::done, [this]() {
        qDebug() << "DONE!";
        ftp->close();
        ftp->deleteLater();
    });
connect(ftp, &QFtp::commandFinished, [this]() {
        qDebug() << "COMMAND FINISHED!";

            if (reportFile != nullptr) {
                reportFile.close();
                reportFile->deleteLater();
            }
    });

ftp->list("ftp path to dir");

因此,它应该下载文件,关闭它并deleteLater以获取ftp目录中的所有文件。有什么想法怎么做?感谢。

1 个答案:

答案 0 :(得分:0)

我终于修好了!

我的代码:

QQueue<QFile*> reportQueue; //initialize the queue

connect(ftp, &QFtp::listInfo, [this](const QUrlInfo &ftpUrlInfo) {
        if (ftpUrlInfo.isFile()) {
            reportQueue.append(new QFile("local path" + "\\" + ftpUrlInfo.name()));
        }
    });
    connect(ftp, &QFtp::done, [this]() {
        emit reportsDataFinished();
    });
    connect(ftp, &QFtp::commandFinished, [this]() {
        if (ftp->currentCommand() == QFtp::List) {
            proceedDownload();
        } else if (ftp->currentCommand() == QFtp::Get) {
            reportFile->close();
            reportFile->deleteLater();
            proceedDownload();
        }
    });

    if (ftp->error() == QFtp::NotConnected) {
        emit ftpReportError(ftp->error());
    } else {
        ftp->list("ftp path to the dir");
    }

void Test::proceedDownload()
{
    if (!reportQueue.isEmpty()) {
        reportFile = reportQueue.dequeue();
        reportFile->open(QIODevice::WriteOnly);
        QFileInfo ftpFileInfo(reportFile->fileName());
        ftp->get("ftp path to file" + "/" + ftpFileInfo.fileName(), reportFile, QFtp::Binary);
    }
}

我将文件添加到QQueue,当ftp list命令完成后,我使用了函数proceedDownload()。在函数中,我dequeue()reportFile的队列并继续使用ftp get()函数。当get ftp命令完成后,我closedelete内存中的文件,然后再次调用proceedDownload()。所以整个过程再次进行,直到队列为空。我在与emit reportsDataFinished();的连接中使用closeFtp()信号,其中ftp关闭,deleteLater()释放资源。所有文件下载都很好。谢谢。