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
英文地址,請注明出處:http://en.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 拼接函…