qt5使用QNetworkAccessManager实现ftp功能,但无法获取ftp服务器上的文件列表等信息,仅支持上传,下载,无法进行文件夹创建及删除,因此需要编译qt4的ftp组件,将其放入相应的include,lib及bin文件夹下。
QFtp源码地址:https://github.com/qt/qtftp
windows搭建ftp服务器参考:https://blog.csdn.net/qq_44402184/article/details/127046817
使用QFtp实现上传获取列表等功能代码如下:
//建立连接
ftp = new QFtp(this);
connect(ftp, &QFtp::commandFinished, this, &QFtpWidget::ftpCommandFinishedSlot);
//通过slot解析具体内容
void QFtpWidget::ftpCommandFinishedSlot(int i, bool error) {
if (ftp->currentCommand() == QFtp::ConnectToHost)
{
if (error) {
ui.textBrowser->append("FTP连接失败-----");
return;
}
else {
ui.textBrowser->append("FTP连接成功-----");
ui.selecFiletBtn->setEnabled(true);
// ui.filepathEt->setEnabled(true);
ui.preBtn->setEnabled(true);
connect(ftp, &QFtp::listInfo, this, &QFtpWidget::getListSlot);
ftp->list();
}
}
else if (ftp->currentCommand() == QFtp::List) {
updateTableWgtData();
// qDebug() << "yes list--------------------m_ftpFileList size: " << m_ftpFileList.size();;
}
else if (ftp->currentCommand() == QFtp::Put) {
qDebug() << "i-----------------" << i;
if (error) {
ui.textBrowser->append("文件上传失败--------------------------");
}
else {
ui.textBrowser->append("文件上传成功--------------------------");
ftp->list();
m_infoVec.clear();
}
}
}
//通过文件信息解析
void QFtpWidget::getListSlot(const QUrlInfo info) {
FileInfo finfo;
if (info.isFile()) {
//qDebug() << "file-----------------------";
finfo.type = FileType::File;
}
else if (info.isDir()) {
finfo.type = FileType::Folder;
}
QString name = QString::fromLocal8Bit(info.name().toLatin1());
finfo.filename = name;
int size = info.size();
QString fsize = "";
if (size < KData) {
fsize = QString::number(size).append("B");
}
else if (size > KData && size < MData) {
double s = 1.0 * size / KData;
s = round(s * 100) * 0.01;
fsize = QString::number(s).append("KB");
}
else {
double s = 1.0 * size / MData;
s = round(s * 100) * 0.01;
fsize = QString::number(s).append("MB");
}
finfo.size = fsize;
QString time = info.lastModified().toString();
finfo.time = time;
m_infoVec.push_back(finfo);
}
//将列表信息用tableWidget显示
void QFtpWidget::updateTableWgtData() {
//清空数据
if (ui.tableWidget->rowCount() > 0) {
while (ui.tableWidget->rowCount() > 0) {
ui.tableWidget->removeRow(ui.tableWidget->rowCount() - 1);
}
}
if (m_infoVec.empty()) {
return;
}
ui.tableWidget->setRowCount(m_infoVec.size());
int size = ui.tableWidget->rowCount();
connect(ui.tableWidget, &QTableWidget::cellDoubleClicked, this, &QFtpWidget::cellDoubleClickedSlot);
for (int i = 0; i < size; i++) {
ui.tableWidget->setRowHeight(i, 30);
QTableWidgetItem* btItem = new QTableWidgetItem(); //靶体
FileInfo finfo = m_infoVec[i];
btItem->setTextAlignment(Qt::AlignLeft); //文字居中
btItem->setFlags(btItem->flags() & (~Qt::ItemIsEditable));
if (finfo.type == FileType::File) {
btItem->setIcon(QIcon("file.png"));
}
else {
btItem->setIcon(QIcon("folder.png"));
}
btItem->setText(finfo.filename);
ui.tableWidget->setItem(i, 0, btItem);
QTableWidgetItem* btItem1 = new QTableWidgetItem();
btItem1->setTextAlignment(Qt::AlignHCenter); //文字居中
btItem1->setText(finfo.size);
ui.tableWidget->setItem(i, 1, btItem1);
btItem1->setFlags(btItem1->flags() & (~Qt::ItemIsEditable));
QTableWidgetItem* btItem2 = new QTableWidgetItem();
btItem2->setTextAlignment(Qt::AlignHCenter); //文字居中
btItem2->setText(finfo.time);
ui.tableWidget->setItem(i, 2, btItem2);
btItem2->setFlags(btItem2->flags() & (~Qt::ItemIsEditable));
}
}
动态显示如下: