从 Ftp 问题下载多个文件

Download multiple files from Ftp issue

我想从我的 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 目录中的所有文件。任何想法如何去做?谢谢

我终于修好了!

我的代码:

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然后继续ftpget()函数。当 get ftp 命令完成时,我从内存中 closedelete 文件,并再次调用 proceedDownload()。所以整个过程再次进行,直到队列为空。我在与插槽 closeFtp() 的连接中使用 emit reportsDataFinished(); 信号,其中 ftp 关闭并且 deleteLater() 释放资源。所有文件下载良好。谢谢。