#include #include #include "filecopier.h" FileCopier::FileCopier(QObject *parent) : QThread(parent), mCancel(false), mTotal(0), mCopied(0){} void FileCopier::addJob(const QString &source, const QString &dest){ QMutexLocker l(&mAddJobMutex); if(!mJobs.contains(source)){ mJobs[source] = dest; ++mTotal; } } void FileCopier::run(){ mCancel = false; mCopied = 0; while(!mJobs.isEmpty()){ mAddJobMutex.lock(); auto first = mJobs.constBegin(); auto source = first.key(); auto dest = first.value(); mJobs.remove(source); mAddJobMutex.unlock(); QString msg = QString(tr("Copy: %1 (%2/%3)")).arg(source).arg(QString::number(mCopied + 1)).arg(QString::number(mTotal)); QString cmsg = QString("%1/%2").arg(QString::number(mCopied + 1)).arg(QString::number(mTotal)); emit copying(true, cmsg); emit message(msg); QFile sFile(source); if(sFile.copy(dest)){ ++mCopied; QString msg = QString(tr("Copied file %1/%2").arg(QString::number(mCopied)).arg(QString::number(mTotal))); emit message(msg); }else{ QString msg = QString(tr("Failed to copy %1: %2").arg(source).arg(sFile.errorString())); emit message(msg); } QMutexLocker l(&mCancelMutex); if(mCancel){ break; } } mCancel = false; mTotal = 0; mJobs.clear(); } void FileCopier::cancel(){ QMutexLocker l(&mCancelMutex); emit message(tr("Canceling copy jobs. Please wait...")); mCancel = true; }