QtDemo-多线程拷贝文件

使用Qt线程进行拷贝多个文件至指定目录
直接看效果图:
在这里插入图片描述

下面粘贴部分源码:

void Widget::on_pushButton_clicked()
{
    //获取待复制文件
    ffilename=QFileDialog::getOpenFileNames(this);

    //获取目标文件夹路径
    QString str=QFileDialog::getExistingDirectory(this);

    //获取每个文件的路径,存放至tfilename中
    for(int i=0;i<ffilename.size();i++)
    {
        QFileInfo info= QFileInfo(ffilename.at(i));
        QString name=info.fileName();
        tfilename<<str+"/"+name;
    }

    for(int i=0;i<ffilename.size();i++)
    {
        Worker *worker=new Worker;
        workergroup.push_back(worker);
        QThread *thread=new QThread(this);
        threadgroup.push_back(thread);
        worker->moveToThread(thread);

        connect(this,&Widget::startCopy,worker,&Worker::copyFile);
        connect(thread,&QThread::finished,worker,&Worker::deleteLater);
        thread->start();
        emit startCopy(ffilename.at(i),tfilename.at(i));

    }
}

void Widget::on_pushButton_2_clicked()
{
    //获取待复制文件
    ffilename=QFileDialog::getOpenFileNames(this);

    //获取目标文件夹路径
    QString str=QFileDialog::getExistingDirectory(this);

    //获取每个文件的路径,存放至tfilename中
    for(int i=0;i<ffilename.size();i++)
    {
        QFileInfo info= QFileInfo(ffilename.at(i));
        QString name=info.fileName();
        tfilename<<str+"/"+name;
    }

    for(int i=0;i<ffilename.size();i++)
    {
        Worker2 *worker2=new Worker2(this);
        worker2->fromfilename=ffilename[i];
        worker2->tofilename=tfilename[i];
        worker2->start();


    }
}

void Worker::copyFile(const QString fromfilename,const QString tofilename)
{
    char* byteTemp = new char[4096];//字节数组
    int fileSize = 0;
    int totalCopySize = 0;
    QFile tofile;
    //ui->progressBar_copy->setValue(0);
    tofile.setFileName(tofilename);
    if(!tofile.open(QIODevice::ReadWrite))
    {
        qDebug() << "open tofile failed!!!";
        return ;
    }
    QDataStream out(&tofile);
    //out.setVersion(QDataStream::Qt_4_8);

    QFile fromfile;
    fromfile.setFileName(fromfilename);
    if(!fromfile.open(QIODevice::ReadOnly)){
        qDebug() << "open fromfile failed!!!";
        return ;
    }
    fileSize = fromfile.size();
    QDataStream in(&fromfile);


    while(!in.atEnd())
    {
        int readSize = 0;
        //读入字节数组,返回读取的字节数量,如果小于4096,则到了文件尾
        readSize = in.readRawData(byteTemp, 4096);
        if(readSize==-1)
        {
            qDebug()<<"read error!!!";
            return;
        }
        int writeSize=out.writeRawData(byteTemp, readSize);
        if(writeSize==-1)
        {
            qDebug()<<"write error!!!";
            return;
        }
        totalCopySize += readSize;
        qDebug()<<"此线程是:"<<QThread::currentThreadId()<<" 复制进度:"<<totalCopySize*1./fileSize*100<<"%";
    }

    if(totalCopySize != fileSize){
        qDebug()<<"文件传输未成功";
        return ;
    }

}


完整代码请点击
(仓库中也有一些其它小项目或Demo需要的自提,如果觉得对您有帮助的话可以star一下哟)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值