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

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.dtcms.com/a/326526.html

相关文章:

  • AcWing 6479. 点格棋
  • 数据结构-排序(2)
  • 嵌入式 - Linux软件编程:标准IO
  • 文件夹生成器,一键批量生成,效率提升!
  • 1.Apollo Planning 模块总结
  • 一键生成AI视频!Spring Cloud微服务架构的AgentAlVideo平台开源啦!
  • 内存问题排查工具ASan初探
  • 【liunx】web高可用---nginx
  • AR 智能眼镜:从入门到未来
  • DDIA第五章:复制
  • PCB批量线路板厂家有哪些?
  • LAMPLNMP 最佳实践
  • Ubuntu 22.04 离线环境下 Python 包与 FFmpeg 安装全攻略​
  • 嵌入式Linnux学习 -- 软件编程2
  • linux下部署 dify,并配置本地ollama大模型
  • 【排序算法】⑤冒泡排序
  • Java学习 -- 可变参数与Collections工具类
  • docker安装Engine stopped
  • AI自动生成接口测试脚本全流程
  • 当AI重塑世界:普通人如何成为“主动进化者”?
  • 在 .NET Core 5.0 中启用 Gzip 压缩 Response
  • ECCV 2024 论文解读丨具身智能、机器人研究最新突破创先点分享合集
  • MCU中的存储器映射(Memory Map)
  • 登录系统英文使用 Sign In?Log In?还是 Log On?
  • Windows Server 2022域控制器部署与DNS集成方案
  • 大模型工程问题
  • Python网络爬虫(一) - 爬取静态网页
  • 打烊:餐厅开业前的“压力测试”
  • nginx 设置二级目录-实战
  • P1967 [NOIP 2013 提高组] 货车运输【题解】