使用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一下哟)