从 Ftp 问题下载多个文件

Posted

技术标签:

【中文标题】从 Ftp 问题下载多个文件【英文标题】:Download multiple files from Ftp issue 【发布时间】:2018-04-03 15:55:58 【问题描述】:

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

【问题讨论】:

你需要堆上的reportFile吗?您可以简单地使用ftp-&gt;get("some ftp path" + ftpUrlInfo.name(), 0, QFtp::Binary); 并连接到readyRead() 您正在尝试下载文件,而您仍在检索目录列表。 FTP不能像那样多路复用。让您的 listInfo 处理程序将文件信息保存到本地列表,然后在 list 命令完成后,您可以遍历本地列表以下载每个文件 @user3606329 我会试试的。谢谢。 @RemyLebeau 我也会尝试您的解决方案并稍后回复。谢谢。 @user3606329 我试过了,但同样的问题仍然存在。我想我应该使用某种队列并一个一个下载文件。 【参考方案1】:

我终于修好了!

我的代码:

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() 释放资源。所有文件下载良好。谢谢。

【讨论】:

以上是关于从 Ftp 问题下载多个文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 FluentFTP 从 FTP 并发下载多个文件,最大值

java ftp连接一次下载多个文件

java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题

linux批量下载FTP服务器文件

mget命令, ftp命令详解

在c#中将多个文件上传到FTP