QFtp在切换目录、上传文件、下载文件、删除文件等一系列操作时,如何按照预期操作指令顺序执行

FTP服务初始化时,考虑到重连、以及commandFinished信号信号执行完成置m_bCmdFinished 为true;

void ICore::connectFtpServer()
{if(g_pFile == nullptr){g_pFile = new QFile;}if(g_pFtp){g_pFtp->state();g_pFtp->abort();g_pFtp->deleteLater();g_pFtp = nullptr;m_bCmdFinished = false;}if (g_pFtp == nullptr){g_pFtp = new QFtp;
//        connect(ICore::instance().getFtpPtr(), &QFtp::dataTransferProgress,[](qint64 readBytes, qint64 totalBytes){
//            if(readBytes == totalBytes)
//            {
//                 qDebug() << QString::fromLocal8Bit("数据传输结束,%1字节/%2字节").arg(readBytes).arg(totalBytes);
//            }
//        });connect(ICore::instance().getFtpPtr(), &QFtp::stateChanged,[](int state){cDebug(QString(u8"FTP状态改变:%1!").arg(state));if(QFtp::LoggedIn != state){/*g_pFtp->state();g_pFtp->abort();g_pFtp->deleteLater();g_pFtp = nullptr;connectFtpServer();*/cDebug(u8"FTP服务器断开,正在进行重连!");
//                m_bCmdFinished = false;}
//            else if(QFtp::Connected == state){
//                cDebug(u8"FTP服务器连接成功!");
//                m_bCmdFinished = true;
//            }
//            else if(QFtp::LoggedIn == state){
//                cDebug(u8"FTP服务器登录成功!");
//                m_bCmdFinished = true;
//            }});connect(ICore::instance().getFtpPtr(), &QFtp::listInfo,[](QUrlInfo urlInfo){if( !urlInfo.name().isEmpty()){m_ftpUrlList.insert(QString::fromLocal8Bit(urlInfo.name().toLatin1()));}});connect(g_pFtp, &QFtp::commandFinished,[](int ret, bool error){if (error){cDebug(QString::fromLocal8Bit(u8"正在操作FTP服务器,操作失败:%1").arg(g_pFtp->errorString()));}else{if(g_pFtp->currentCommand() == QFtp::ConnectToHost){cDebug(tr(u8"正在连接FTP服务器,成功连接到服务器"));m_bCmdFinished = true;}else if (g_pFtp->currentCommand() == QFtp::Login) {cDebug(tr(u8"正在连接FTP服务器,登录成功"));m_ftpUrlList.clear();g_pFtp->list();m_bFtpVaild = true;m_reConnectFtpTimer.start(10000);}else if (g_pFtp->currentCommand() == QFtp::Close) {cDebug(tr(u8"正在断开FTP服务器连接,断开成功"));m_ftpUrlList.clear();g_pFile->close();m_bFtpVaild = false;m_bCmdFinished = true;}else if (ICore::instance().getFtpPtr()->currentCommand() == QFtp::Cd){cDebug(tr(u8"正在操作FTP服务器,切换路径成功!"));m_ftpUrlList.clear();g_pFtp->list();g_pFile->close();}else if (ICore::instance().getFtpPtr()->currentCommand() == QFtp::Put){cDebug(tr(u8"正在操作FTP服务器,文件上传完成"));m_ftpUrlList.clear();g_pFtp->list();g_pFile->close();}else if (ICore::instance().getFtpPtr()->currentCommand() == QFtp::Mkdir){cDebug(tr(u8"正在操作FTP服务器,新建目录完成"));m_ftpUrlList.clear();g_pFtp->list();}if (ICore::instance().getFtpPtr()->currentCommand() == QFtp::Get) {cDebug(tr(u8"正在操作FTP服务器,文件下载完成"));m_ftpUrlList.clear();g_pFtp->list();g_pFile->close();}else if(ICore::instance().getFtpPtr()->currentCommand() == QFtp::Rmdir || ICore::instance().getFtpPtr()->currentCommand() == QFtp::Remove){cDebug(tr(u8"正在操作FTP服务器,文件删除完成!"));m_ftpUrlList.clear();g_pFtp->list();}else if(ICore::instance().getFtpPtr()->currentCommand() == QFtp::List){m_bCmdFinished = true;}}});QSettings settings("./data/ftpCfg.ini", QSettings::IniFormat);settings.setIniCodec(QTextCodec::codecForName("UTF-8"));QString hostName = settings.value("server/hostName").toString();uint port = settings.value("server/port").toString().toUInt();g_pFtp->connectToHost(hostName, port);//连接成功,执行下一条指令while(!m_bCmdFinished){QCoreApplication::processEvents();QThread::msleep(10);}resetCmdFinished();g_pFtp->login("anonymous","");//登录成功,执行下一条指令while(!m_bCmdFinished){QCoreApplication::processEvents();QThread::msleep(10);}resetCmdFinished();g_pFtp->list();}
}

以UI界面上传文件为例,

{//第一步:根据资源类型,判断目录是否存在,不存在则创建目录ICore::instance().getFtpPtr()->cd(ICore::instance().getFTPRootDir());QString sDir = comboBox_type->currentText();QString sdir = QString::fromLatin1(comboBox_type->currentText().toLocal8Bit());if(!ICore::instance().isExist(sDir)){while(!ICore::instance().currentCmdIsFinished()){QCoreApplication::processEvents();QThread::msleep(10);}ICore::instance().resetCmdFinished();ICore::instance().getFtpPtr()->mkdir(sdir);}//第二步:切换进目录while(!ICore::instance().currentCmdIsFinished()){QCoreApplication::processEvents();QThread::msleep(10);}ICore::instance().resetCmdFinished();ICore::instance().getFtpPtr()->cd(sdir);//第三步:上传本地文件至ftp服务器while(!ICore::instance().currentCmdIsFinished()){QCoreApplication::processEvents();QThread::msleep(10);}ICore::instance().resetCmdFinished();QString fileName =  m_pUpLoadRecord.filepath.split("/").takeLast();QString filename = QString::fromLatin1( m_pUpLoadRecord.filepath.toLocal8Bit());if(!ICore::instance().isExist(fileName)){ICore::instance().getLocalFile()->setFileName( lineEdit_filePath->property("fullFilePath").toString());if (ICore::instance().getLocalFile()->isOpen()) {ICore::instance().getLocalFile()->close();}ICore::instance().getLocalFile()->open(QIODevice::ReadOnly);ICore::instance().getFtpPtr()->put(ICore::instance().getLocalFile(), filename);}else{qDebug() << QString::fromLocal8Bit("ftp服务器目录[%1]下,文件[%2]已存在").arg(sDir).arg(fileName);//第三点一步:删除已有文件while(!ICore::instance().currentCmdIsFinished()){QCoreApplication::processEvents();QThread::msleep(10);}ICore::instance().resetCmdFinished();ICore::instance().getFtpPtr()->remove(filename);//第三点二步:上传新文件while(!ICore::instance().currentCmdIsFinished()){QCoreApplication::processEvents();QThread::msleep(10);}ICore::instance().getLocalFile()->setFileName( lineEdit_filePath->property("fullFilePath").toString());if (ICore::instance().getLocalFile()->isOpen()) {ICore::instance().getLocalFile()->close();}ICore::instance().getLocalFile()->open(QIODevice::ReadOnly);ICore::instance().getFtpPtr()->put(ICore::instance().getLocalFile(), filename);}//第四步:返回根目录while(!ICore::instance().currentCmdIsFinished()){QCoreApplication::processEvents();QThread::msleep(10);}ICore::instance().resetCmdFinished();ICore::instance().getFtpPtr()->cd(ICore::instance().getFTPRootDir());//第五步:等待返回根目录后,上传记录到数据库表while(!ICore::instance().currentCmdIsFinished()){QCoreApplication::processEvents();QThread::msleep(10);}ICore::instance().resetCmdFinished();.........
}

参见【QFtp在QT5版本下使用时遇到部分问题解决方案_qftp被断开重连-CSDN博客】

参见【Qt 应用开发】轻松掌握Qt FTP 机制:实现高效文件传输-阿里云开发者社区

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/93633.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/93633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSE高级-02

文章目录1. 多线程1.1 创建线程的三种方式多线程的创建方式一&#xff1a;继承Thread类多线程的创建方式二&#xff1a;实现Runnable接口多线程的创建方式三&#xff1a;实现Callable接口三种线程的创建方式对比Thread的常用方法1.2 线程安全线程同步方式一&#xff1a;同步代码…

从舒适度提升到能耗降低再到安全保障,楼宇自控作用关键

在现代建筑的发展历程中&#xff0c;楼宇自动化控制系统&#xff08;BAS&#xff09;已从单纯的设备管理工具演变为集舒适度优化、能耗控制与安全保障于一体的核心技术。随着物联网和人工智能的深度应用&#xff0c;楼宇自控系统正以数据为纽带&#xff0c;重构人与建筑的关系。…

图像分类精度评价的方法——误差矩阵、总体精度、用户精度、生产者精度、Kappa 系数

本文详细介绍 “图像分类精度评价的方法”。 图像分类后&#xff0c;需要评估分类结果的准确性&#xff0c;以判断分类器的性能和结果的可靠性。 常涉及到下面几个概念&#xff08;指标&#xff09; 误差矩阵、总体精度、用户精度、生产者精度和 Kappa 系数。1. 误差矩阵&#…

【科普向-第一篇】数字钥匙生态全景:手机厂商、车厂与协议之争

目录 一、协议标准之争&#xff1a;谁制定规则&#xff0c;谁掌控入口 1.1 ICCE&#xff1a;中国车企主导的自主防线 1.2 ICCOA&#xff1a;手机厂商的生态突围 1.3 CCC&#xff1a;国际巨头的高端壁垒 1.4 协议对比 二、底层技术路线&#xff1a;成本与安全的博弈 2.1B…

dockerfile及docker常用操作

1: docker 编写 Dockerfile 是用于构建 Docker 镜像的文本文件&#xff0c;包含一系列指令和参数&#xff0c;用于定义镜像的构建过程 以下是关键要点&#xff1a; 一、基本结构 ‌FROM‌&#xff1a;必须作为第一条指令&#xff0c;指定基础镜像&#xff08;如 FROM python:3.…

[vibe coding-lovable]lovable是不是ai界的复制忍者卡卡西?

在火影忍者的世界里&#xff0c;卡卡西也被称为复制忍者&#xff0c;因为大部分忍术都可以被其Copy! 截图提示:实现这个效果 -> 发给Lovalbe -> 生成的的效果如下&#xff0c;虽然不是1比1还原&#xff0c;但是这个效果也很惊艳。 这个交互设计&#xff0c;这个UI效果&am…

技术赋能安全:智慧工地构建城市建设新防线

城市建设的热潮中&#xff0c;工地安全始终是关乎生命与发展的核心议题。江西新余火灾等事故的沉痛教训&#xff0c;暴露了传统工地监管的诸多短板——流动焊机“行踪难觅”&#xff0c;无证动火作业屡禁不止&#xff0c;每一次监管缺位都可能引发灾难性后果。如今&#xff0c;…

Sublime Text 代码编辑器(Mac中文)

原文地址&#xff1a;Sublime Text Mac 代码编辑器 sublime text Mac一款轻量级的文本编辑器&#xff0c;拥有丰富的功能和插件。 它支持多种编程语言&#xff0c;包括C、Java、Python、Ruby等&#xff0c;可以帮助程序员快速编写代码。 Sublime Text的界面简洁、美观&#…

如何制定项目时间线,合理预计?

制定一份现实可行且行之有效的项目时间线&#xff0c;是一个系统性的分解、估算与排序过程&#xff0c;而非简单的日期罗列。核心步骤包括&#xff1a;明确项目范围与可交付成果、利用工作分解结构&#xff08;WBS&#xff09;进行任务拆解、科学估算各项任务的持续时间、识别并…

RSA详解

一、RSA 简介RSA 是一种公钥密码体制&#xff0c;由罗纳德・李维斯特&#xff08;Ron Rivest&#xff09;、阿迪・萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德・阿德曼&#xff08;Leonard Adleman&#xff09;于 1977 年提出&#xff0c;算法名称由他们三人姓氏的首字母…

Linux获取物理硬盘总容量

获取物理硬盘总容量: 1.查看单个硬盘: 使用 lsblk 或 fdisk -l (需要 sudo) 命令。它们会直接列出物理硬盘 (sda, nvme0n1 等) 和它们的分区,并显示硬盘的总物理容量。 abcd四块物理盘,只挂载使用3块,留一块未使用 最常见的原因通常是配置了热备盘(RAID 1/5/6/10 等冗余…

STM32学习笔记14-I2C硬件控制

I2C外设简介STM32内部集成了硬件I2C收发电路&#xff08;硬件收发器&#xff1a;自动生产波形&#xff0c;自动翻转电平等&#xff09;&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担——软件只需要写入控制…

电子电气架构 --- 软件开发数字化转型

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

我国空间站首次应用专业领域 AI大模型

据中国载人航天工程办公室消息&#xff0c;北京时间2025年8月15日22时47分&#xff0c;经过约6.5小时的出舱活动&#xff0c;神舟二十号乘组航天员陈冬、陈中瑞、王杰密切协同&#xff0c;在空间站机械臂和地面科研人员的配合支持下&#xff0c;圆满完成既定任务&#xff0c;出…

WPF真入门教程35--手搓WPF出真汁【蜀味正道CS版】

1、项目介绍 本项目采用多层架构设计&#xff0c;使用wpf&#xff0c;Panuon.UI.Silver控件库&#xff0c;AduSkin皮肤&#xff0c;MVVM等技术开发具有复杂交互和视觉效果的CS应用程序。WPF适用于企业级桌面应用&#xff1a;如ERP、CRM系统&#xff0c;需复杂表单和报表。WPF适…

JMeter与大模型融合应用之构建AI智能体:评审性能测试脚本

JMeter与大模型融合应用之构建AI智能体&#xff1a;评审性能测试脚本 一、引言 随着DevOps和持续测试的普及&#xff0c;性能测试已成为软件开发生命周期中不可或缺的环节。Apache JMeter作为最流行的开源性能测试工具之一&#xff0c;被广泛应用于各种性能测试场景。然而&…

K8s 和 Docker的区别

一、各自诞生背景——为什么需要两个东西Docker&#xff08;2013&#xff0c;Docker Inc.&#xff09; • 目的&#xff1a;解决“我的代码在你机器跑不起来”的经典环境问题。 • 做法&#xff1a;用 Linux 内核的 cgroup/namespace 做轻量隔离&#xff0c;把“应用 依赖”打…

10.0 UML的介绍以及VisualStudio中查看类图

本文介绍UML图的含义、以及如何在VisualStudio中查看类图。 一、UML图介绍 UML(Unified Modeling Language,统一建模语言)是一种标准化的建模语言,用于可视化、规范、构建和记录软件系统的各个方面的图表工具。 UML图分为结构图和行为图两大类: 结构图‌…

【Virtual Globe 渲染技术笔记】6 着色

着色&#xff08;Shading&#xff09; 曲面细分只是地球渲染的第一步。接下来是着色——通过模拟光线与材质的相互作用&#xff0c;计算每个像素的最终颜色。本节先回顾基础的光照与纹理映射&#xff0c;再讲解虚拟地球特有的经纬网格和夜景灯光效果。6.1 光照&#xff08;Ligh…

OpenCV Python——图像拼接(一)(图像拼接原理、基础知识、单应性矩阵 + 图像变换 + 拼接)

1 图像拼接基础知识1.1 特征匹配 原理及代码示例1.2 单应性矩阵 原理及代码示例2 图像拼接&#xff08;一&#xff09;&#xff08;直接拼接&#xff09;3 图像拼接&#xff08;二&#xff09;&#xff08;单应性矩阵 图像变换 拼接&#xff09;3.1 单应性矩阵函数3.2 拼接函…