从 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->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 命令完成后,我将close
和delete
从内存中提取文件,并再次调用proceedDownload()
。所以整个过程再次进行,直到队列为空。我使用emit reportsDataFinished();
信号连接到插槽closeFtp()
,其中ftp 关闭,deleteLater()
释放资源。所有文件下载良好。谢谢。
【讨论】:
以上是关于从 Ftp 问题下载多个文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 FluentFTP 从 FTP 并发下载多个文件,最大值