当前位置: 首页 > java >正文

QT QProcess + xcopy 实现文件拷贝

Windows客户端软件,要实现文件的复制,方法有很多。本次探讨的方案是使用QProcess + xcopy方式实现文件夹的复制。
在这里插入图片描述

头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QDialog>
#include <QProcess>QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACEclass MainWindow : public QDialog
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();private slots:void on_button_copy_clicked();void OutputDetail(const QString &tips);private slots://processvoid OnReadyReadStandardOutput();void OnReadyReadStandardError();void OnErrorOccurred(QProcess::ProcessError state);void OnStateChanged(QProcess::ProcessState newState);void OnFinished(int exitCode, QProcess::ExitStatus exitStatus);private:Ui::MainWindow *ui;QProcess *m_process = nullptr;  //copy process
};
#endif // MAINWINDOW_H

cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDir>
#include <QProcess>
#include <QDebug>const QString SPLIT_LINE = QStringLiteral("----------------------------------------");MainWindow::MainWindow(QWidget *parent): QDialog(parent), ui(new Ui::MainWindow), m_process(new QProcess)
{ui->setupUi(this);connect(m_process, &QProcess::readyReadStandardOutput, this, &MainWindow::OnReadyReadStandardOutput);connect(m_process, &QProcess::readyReadStandardError, this, &MainWindow::OnReadyReadStandardError);connect(m_process, &QProcess::errorOccurred, this, &MainWindow::OnErrorOccurred);connect(m_process, &QProcess::stateChanged, this, &MainWindow::OnStateChanged);connect(m_process, QOverload<int, QProcess::ExitStatus>::of(&QProcess::finished), this, &MainWindow::OnFinished);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_button_copy_clicked()
{QString srcFolder = ui->edit_src->text();QString dstFolder = ui->edit_dst->text();if(srcFolder.isEmpty() || dstFolder.isEmpty()){OutputDetail("The source folder or target folder path is empty!");return;}//参数说明:递归复制 创建目录 覆盖不提示QString command = QString("xcopy %1 %2 /E /I /Y").arg(QDir::toNativeSeparators(srcFolder) + "\\*.*").arg(QDir::toNativeSeparators(dstFolder));OutputDetail(command);//m_process->start(command);if(!m_process->waitForStarted()){OutputDetail("Failed to start xcopy process!");return;}#if 0if(!m_process->waitForFinished(30*1000)){OutputDetail("Copy process time out!");return;}//检查执行结果QByteArray output = m_process->readAllStandardOutput();QByteArray error = m_process->readAllStandardError();int exitCode = m_process->exitCode();OutputDetail("exitCode:" + QString::number(exitCode));if(exitCode != 0){OutputDetail("Copy failed with error:\n" + QString::fromUtf8(error));}else{OutputDetail("Copy successed:\n" + output);}
#endif}void MainWindow::OnReadyReadStandardOutput()
{OutputDetail("readAllStandardOutput" + SPLIT_LINE);QString output = QString::fromLocal8Bit(m_process->readAllStandardOutput());OutputDetail(output);
}void MainWindow::OnReadyReadStandardError()
{OutputDetail("readAllStandardError" + SPLIT_LINE);QString error = QString::fromLocal8Bit(m_process->readAllStandardError());OutputDetail(error);
}void MainWindow::OnErrorOccurred(QProcess::ProcessError state)
{switch (state){case QProcess::FailedToStart:OutputDetail("QProcess::errorOccurred: FailedToStart...");break;case QProcess::Crashed:OutputDetail("QProcess::errorOccurred: Crashed...");break;case QProcess::Timedout:OutputDetail("QProcess::errorOccurred: Timedout...");break;case QProcess::WriteError:OutputDetail("QProcess::errorOccurred: WriteError...");break;case QProcess::ReadError:OutputDetail("QProcess::errorOccurred: ReadError...");break;case QProcess::UnknownError:OutputDetail("QProcess::errorOccurred: UnknownError...");break;}
}void MainWindow::OnStateChanged(QProcess::ProcessState newState)
{switch (newState){case QProcess::NotRunning:OutputDetail("QProcess::stateChanged: NotRunning.");break;case QProcess::Starting:OutputDetail("QProcess::stateChanged: Starting.");break;case QProcess::Running:OutputDetail("QProcess::stateChanged: Running.");break;}
}void MainWindow::OnFinished(int exitCode, QProcess::ExitStatus exitStatus)
{OutputDetail("exitCode:" + QString::number(exitCode));if(exitStatus == QProcess::NormalExit)//QProcess::NormalExit{OutputDetail("The process normal exit");}else if(exitStatus == QProcess::CrashExit)//QProcess::CrashExit{OutputDetail("The process crash exit");}
}void MainWindow::OutputDetail(const QString &tips)
{ui->edit_output->append(tips /*+ "\r\n"*/);
}
http://www.xdnf.cn/news/17588.html

相关文章:

  • Web安全自动化测试实战指南:Python与Selenium在验证码处理中的应用
  • Mybatis @Param参数传递说明
  • 【工作笔记】Wrappers.lambdaQuery()用法
  • RK3588在YOLO12(seg/pose/obb)推理任务中的加速方法
  • JS数组排序算法
  • 打靶日常-upload-labs(21关)
  • 【密码学】8. 密码协议
  • Android 开发问题:Invalid id; ID definitions must be of the form @+id/ name
  • 【系统分析师】软件需求工程——第11章学习笔记(上)
  • A#语言详解
  • GitHub上为什么采用Gradle编译要多于Maven
  • 【走进Docker的世界】深入理解Docker网络:从模式选择到实战配置
  • AI质检数据准备利器:基于Qt/QML 5.14的图像批量裁剪工具开发实战
  • 【代码随想录day 15】 力扣 404. 左叶子之和
  • nginx+Lua环境集成、nginx+Lua应用
  • 自动化备份全网服务器数据平台
  • UE材质World Position 和 Object Position
  • Linux操作系统从入门到实战(十七)进程与进程基本概念
  • Redis一站式指南一:从MySQL事务到Redis持久化及事务实现
  • Error: error:0308010C:digital envelope routines::unsupported at new Hash
  • 计算机视觉(CV)——pytorch张量基本使用
  • 青龙峡拔韭菜
  • 【东枫科技】NTN-IOT 卫星互联网原型系统,高达1.6G大带宽
  • 免费数字人API开发方案
  • 使用正则表达式检测Base64字符串并提取图片类型及正文的JavaScript函数,代码精简且高效
  • How Websites Work 网站如何运作
  • Linux入门指南:26个基础命令全解析
  • C语言(长期更新)第10讲:操作符详解(二)
  • vue3项目中在一个组件中点击了该组件中的一个按钮,那么如何去触发另一个组件中的事件?
  • playwright-mcp 项目全解析:从理论到实践