fun:文件校验功能添加(未结束)。

This commit is contained in:
2025-11-05 13:09:12 +08:00
parent 9bed3ed536
commit 1a81c34840
11 changed files with 229 additions and 15 deletions

View File

@@ -147,7 +147,8 @@
"qxmlstreamwriter": "cpp", "qxmlstreamwriter": "cpp",
"qgraphicsdropshadoweffect": "cpp", "qgraphicsdropshadoweffect": "cpp",
"qpushbutton": "cpp", "qpushbutton": "cpp",
"qpainter": "cpp" "qpainter": "cpp",
"qdialog": "cpp"
}, },
"editor.tokenColorCustomizations": { "editor.tokenColorCustomizations": {
"textMateRules": [ "textMateRules": [

View File

@@ -82,6 +82,29 @@ void ClientCore::onDisconnected()
emit sigDisconnect(); emit sigDisconnect();
} }
void ClientCore::handleAsk(QSharedPointer<FrameBuffer> frame)
{
InfoMsg msg = infoUnpack<InfoMsg>(frame->data);
// TODO: 处理询问请求
if (msg.command == STRMSG_REQUEST_CHECK_FILE_EXIST) {
InfoMsg ans;
ans.command = STRMSG_ANSWER_CHECK_FILE_EXIST;
for (const auto& filePath : msg.list) {
if (!Util::FileExist(filePath)) {
ans.list.append(filePath);
}
}
if (!Send<InfoMsg>(ans, FBT_MSGINFO_ANSWER, frame->fid)) {
auto logMsg = tr("") + frame->fid + tr("返回检查文件存在性消息失败。");
qCritical() << logMsg;
return;
}
return;
}
// 未知信息
qWarning() << QString(tr("未知询问信息类型:%1")).arg(msg.command);
}
void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame) void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
{ {
switch (frame->type) { switch (frame->type) {
@@ -182,7 +205,7 @@ void ClientCore::UseFrame(QSharedPointer<FrameBuffer> frame)
break; break;
} }
case FBT_MSGINFO_ASK: { case FBT_MSGINFO_ASK: {
emit sigMsgAsk(frame); handleAsk(frame);
break; break;
} }
case FBT_MSGINFO_ANSWER: { case FBT_MSGINFO_ANSWER: {

View File

@@ -89,6 +89,7 @@ signals:
private: private:
void onReadyRead(); void onReadyRead();
void onDisconnected(); void onDisconnected();
void handleAsk(QSharedPointer<FrameBuffer> frame);
private: private:
void UseFrame(QSharedPointer<FrameBuffer> frame); void UseFrame(QSharedPointer<FrameBuffer> frame);

View File

@@ -106,8 +106,11 @@ void LoadingDialog::moveToCenter(QWidget* pParent)
*/ */
void LoadingDialog::cancelBtnClicked() void LoadingDialog::cancelBtnClicked()
{ {
if (isShow_) {
isShow_ = false;
emit cancelWaiting(); emit cancelWaiting();
this->done(USER_CANCEL); this->done(USER_CANCEL);
}
} }
/** /**
@@ -129,6 +132,12 @@ void LoadingDialog::paintEvent(QPaintEvent* event)
QWidget::paintEvent(event); QWidget::paintEvent(event);
} }
int LoadingDialog::exec()
{
isShow_ = true;
return QDialog::exec();
}
LoadingDialog::~LoadingDialog() LoadingDialog::~LoadingDialog()
{ {
delete m_pLoadingMovie; delete m_pLoadingMovie;

View File

@@ -23,6 +23,9 @@ public:
// 移动到指定窗口中间显示 // 移动到指定窗口中间显示
void moveToCenter(QWidget* pParent); void moveToCenter(QWidget* pParent);
public:
int exec() override;
protected: protected:
void paintEvent(QPaintEvent* event) override; void paintEvent(QPaintEvent* event) override;
@@ -32,7 +35,7 @@ private:
Q_SIGNALS: Q_SIGNALS:
void cancelWaiting(); void cancelWaiting();
private slots: public slots:
void cancelBtnClicked(); void cancelBtnClicked();
private: private:
@@ -40,6 +43,7 @@ private:
QLabel* m_pMovieLabel; QLabel* m_pMovieLabel;
QMovie* m_pLoadingMovie; QMovie* m_pLoadingMovie;
QLabel* m_pTipsLabel; QLabel* m_pTipsLabel;
bool isShow_{};
QPushButton* m_pCancelBtn; QPushButton* m_pCancelBtn;
}; };
#endif // LOADINGDIALOG_H #endif // LOADINGDIALOG_H

View File

@@ -1,5 +1,6 @@
#include "Transform.h" #include "Transform.h"
#include <QFileInfo>
#include <QMessageBox> #include <QMessageBox>
#include "ui_Transform.h" #include "ui_Transform.h"
@@ -146,3 +147,105 @@ void TransForm::closeEvent(QCloseEvent* event)
exis_ = true; exis_ = true;
QDialog::closeEvent(event); QDialog::closeEvent(event);
} }
CheckCondition::CheckCondition(QObject* parent) : QThread(parent)
{
}
void CheckCondition::SetClientCore(ClientCore* clientCore)
{
clientCore_ = clientCore;
}
void CheckCondition::SetTasks(const QVector<TransTask>& tasks)
{
tasks_ = tasks;
}
void CheckCondition::recvFrame(QSharedPointer<FrameBuffer> frame)
{
InfoMsg info = infoUnpack<InfoMsg>(frame->data);
if (info.command == STRMSG_ANSWER_CHECK_FILE_EXIST) {
remoteNotExits_ = info.list;
qInfo() << tr("检查结束,远端不存在的文件数:") << remoteNotExits_.size();
msg_ = info.command;
return;
}
msg_ = tr("收到未知信息,认为判断失败:") + info.command;
qInfo() << msg_;
}
void CheckCondition::interrupCheck()
{
if (!isAlreadyInter_) {
isAlreadyInter_ = true;
qWarning() << tr("中断文件校验......");
emit sigCheckOver();
}
}
void CheckCondition::run()
{
qInfo() << tr("开始文件校验......");
resultMsgMap_.clear();
checkRet_.clear();
isRun_ = true;
msg_.clear();
isAlreadyInter_ = false;
// 先检查本地文件是否存在
for (const auto& task : tasks_) {
if (task.isUpload && !Util::FileExist(task.localPath)) {
resultMsgMap_[CCR_CHECK_LOCAL_NOT_EXIT].push_back(task.localPath);
if (!checkRet_.contains(CCR_CHECK_LOCAL_NOT_EXIT)) {
checkRet_.push_back(CCR_CHECK_LOCAL_NOT_EXIT);
}
}
if (!task.isUpload && Util::FileExist(task.localPath)) {
resultMsgMap_[CCR_CHECK_LOCAL_EXIT].push_back(task.localPath);
if (!checkRet_.contains(CCR_CHECK_LOCAL_EXIT)) {
checkRet_.push_back(CCR_CHECK_LOCAL_EXIT);
}
}
}
// 再检查远程文件是否存在
InfoMsg msg;
msg.command = STRMSG_REQUEST_CHECK_FILE_EXIST;
for (const auto& task : tasks_) {
msg.list.push_back(task.remotePath);
}
auto f = clientCore_->GetBuffer(msg, FBT_MSGINFO_ASK, clientCore_->GetRemoteID());
if (!ClientCore::syncInvoke(clientCore_, f)) {
auto errMsg = tr("检查远程文件存在性数据发送失败。");
if (!checkRet_.contains(CCR_CHECK_FAILED)) {
checkRet_.push_back(CCR_CHECK_FAILED);
resultMsgMap_[CCR_CHECK_FAILED].push_back(errMsg);
}
emit sigCheckOver();
qCritical() << errMsg;
return;
}
while (isRun_) {
QThread::msleep(10);
if (msg_.isEmpty()) {
continue;
}
if (msg_ != STRMSG_ANSWER_CHECK_FILE_EXIST) {
if (!checkRet_.contains(CCR_CHECK_FAILED)) {
checkRet_.push_back(CCR_CHECK_FAILED);
resultMsgMap_[CCR_CHECK_FAILED].push_back(msg_);
}
} else {
if (!checkRet_.contains(CCR_CHECK_PASSED)) {
checkRet_.push_back(CCR_CHECK_PASSED);
}
}
break;
}
isAlreadyInter_ = true;
emit sigCheckOver();
qInfo() << tr("文件校验结束......");
}

View File

@@ -6,6 +6,7 @@
#include <QDialog> #include <QDialog>
#include <QFile> #include <QFile>
#include <QThread> #include <QThread>
#include <unordered_map>
namespace Ui { namespace Ui {
class TransForm; class TransForm;
@@ -44,9 +45,9 @@ protected:
void closeEvent(QCloseEvent* event) override; void closeEvent(QCloseEvent* event) override;
private: private:
bool exis_{ false }; bool exis_{false};
TranFromTh* workTh_{}; TranFromTh* workTh_{};
qint32 curTaskNum_{ 0 }; qint32 curTaskNum_{0};
QVector<TransTask> tasks_; QVector<TransTask> tasks_;
FileTrans* fileTrans_{}; FileTrans* fileTrans_{};
ClientCore* clientCore_{}; ClientCore* clientCore_{};
@@ -61,6 +62,7 @@ public:
explicit TranFromTh(TransForm* tf, QObject* parent = nullptr) : QThread(parent), tf_(tf) explicit TranFromTh(TransForm* tf, QObject* parent = nullptr) : QThread(parent), tf_(tf)
{ {
} }
protected: protected:
void run() override void run() override
{ {
@@ -73,4 +75,47 @@ private:
TransForm* tf_; TransForm* tf_;
}; };
enum CondCheckResult {
CCR_NO_CHECK = 0,
CCR_CHECK_PASSED,
CCR_CHECK_FAILED,
CCR_CHECK_INTERRUPT,
CCR_CHECK_LOCAL_EXIT,
CCR_CHECK_REMOTE_EXIT,
CCR_CHECK_LOCAL_NOT_EXIT,
CCR_CHECK_REMOTE_NOT_EXIT
};
class CheckCondition : public QThread
{
Q_OBJECT
public:
CheckCondition(QObject* parent = nullptr);
public:
void SetClientCore(ClientCore* clientCore);
void SetTasks(const QVector<TransTask>& tasks);
Q_SIGNALS:
void sigCheckOver();
public Q_SLOTS:
void interrupCheck();
void recvFrame(QSharedPointer<FrameBuffer> frame);
protected:
void run() override;
private:
QString msg_;
bool isRun_;
bool isAlreadyInter_;
QVector<TransTask> tasks_;
ClientCore* clientCore_{};
QVector<QString> remoteNotExits_;
QVector<CondCheckResult> checkRet_;
std::unordered_map<CondCheckResult, QVector<QString>> resultMsgMap_;
};
#endif // TRANSFORM_H #endif // TRANSFORM_H

View File

@@ -1,5 +1,6 @@
#include "frelayGUI.h" #include "frelayGUI.h"
#include <Form/Loading.h>
#include <QLabel> #include <QLabel>
#include <QScreen> #include <QScreen>
#include <QSplitter> #include <QSplitter>
@@ -35,7 +36,7 @@ frelayGUI::frelayGUI(QWidget* parent) : QDialog(parent), ui(new Ui::frelayGUI)
// QLabel* permanent = new QLabel(this); // QLabel* permanent = new QLabel(this);
// permanent->setFrameStyle(QFrame::Box | QFrame::Sunken); // permanent->setFrameStyle(QFrame::Box | QFrame::Sunken);
// permanent->setText(QString("%1 on %2").arg(VERSION_GIT_COMMIT, VERSION_GIT_BRANCH)); // permanent->setText(QString("%1 on %2").arg(VERSION_GIT_COMMIT, VERSION_GIT_BRANCH));
//this->statusBar()->addPermanentWidget(permanent); // this->statusBar()->addPermanentWidget(permanent);
} }
frelayGUI::~frelayGUI() frelayGUI::~frelayGUI()
@@ -142,6 +143,22 @@ void frelayGUI::HandleTask(const QVector<TransTask>& tasks)
return; return;
} }
transform_->SetTasks(tasks); transform_->SetTasks(tasks);
// 检查文件
CheckCondition checkThread(this);
checkThread.SetTasks(tasks);
checkThread.SetClientCore(clientCore_);
LoadingDialog checking(this);
checking.setTipsText("正在检查文件...");
connect(&checkThread, &CheckCondition::sigCheckOver, &checking, &LoadingDialog::cancelBtnClicked);
connect(&checking, &LoadingDialog::cancelWaiting, &checkThread, &CheckCondition::interrupCheck);
connect(clientCore_, &ClientCore::sigMsgAnswer, &checkThread, &CheckCondition::recvFrame);
checkThread.start();
checking.exec();
transform_->exec(); transform_->exec();
} }

View File

@@ -42,9 +42,8 @@ enum FrameBufferType : uint16_t {
}; };
// 字符串标识 // 字符串标识
#define STRMSG_CHECK_FILE_EXIST "checkFileExist" #define STRMSG_REQUEST_CHECK_FILE_EXIST "requestCheckFileExist"
#define STRMSG_FILE_EXIST "fileExist" #define STRMSG_ANSWER_CHECK_FILE_EXIST "answerCheckFileExist"
#define STRMSG_FILE_NOT_EXIST "fileNotExist"
struct FrameBuffer { struct FrameBuffer {
QByteArray data; QByteArray data;

View File

@@ -125,6 +125,16 @@ QString Util::GetVersion()
return ver; return ver;
} }
bool Util::FileExist(const QString& path)
{
return QFile::exists(path);
}
bool Util::DirExist(const QString& path)
{
return QDir(path).exists();
}
QString DirFileHelper::GetErr() const QString DirFileHelper::GetErr() const
{ {
return QString(); return QString();

View File

@@ -49,6 +49,8 @@ public:
static QString GetCurConfigPath(const QString& sub); static QString GetCurConfigPath(const QString& sub);
static void ConsoleMsgHander(QtMsgType type, const QMessageLogContext& context, const QString& msg); static void ConsoleMsgHander(QtMsgType type, const QMessageLogContext& context, const QString& msg);
static QString GetVersion(); static QString GetVersion();
static bool FileExist(const QString& path);
static bool DirExist(const QString& path);
}; };
class DirFileHelper : public QObject class DirFileHelper : public QObject