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"*/);
}