我想从我的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目录中的所有文件。有什么想法怎么做?感谢。
答案 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命令完成后,我close
和delete
内存中的文件,然后再次调用proceedDownload()
。所以整个过程再次进行,直到队列为空。我在与emit reportsDataFinished();
的连接中使用closeFtp()
信号,其中ftp关闭,deleteLater()
释放资源。所有文件下载都很好。谢谢。