qt/LedOK/wProgramManager/threadexportprogrampro.cpp
2022-08-25 18:37:24 +08:00

162 lines
4.7 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "threadexportprogrampro.h"
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QDebug>
#include <QDataStream>
#include <globaldefine.h>
ThreadExportProgramPro::ThreadExportProgramPro()
{
m_createfile = new QDir();
}
ThreadExportProgramPro::~ThreadExportProgramPro()
{
if(m_createfile) {
m_createfile = Q_NULLPTR;
delete m_createfile;
}
}
void ThreadExportProgramPro::SetSourceDirAndDestDir(QString strSource,QString strDest)
{
m_strSource=strSource;
m_strDest=strDest;
}
void ThreadExportProgramPro::run(){
totalCopySize=0;
copyDirectoryFiles(m_strSource,m_strDest,true);
}
bool ThreadExportProgramPro::copyFileToPath(QString sourceDir, QString toDir, bool coverFileIfExist){
if (sourceDir == toDir){
return true;
}
if (!QFile::exists(sourceDir)){
return false;
}
bool exist = m_createfile->exists(toDir);
if (exist){
if(coverFileIfExist){
m_createfile->remove(toDir);
}
}
if(!QFile::copy(sourceDir, toDir)) {
return false;
}
return true;
}
bool ThreadExportProgramPro::copyDirectoryFiles(const QString &fromDir, const QString &toDir, bool coverFileIfExist)
{
QDir sourceDir(fromDir);
QDir targetDir(toDir);
qDebug() << "copyDirectoryFiles:" << fromDir << toDir;
if(!targetDir.exists()){
if(!targetDir.mkdir(targetDir.absolutePath())) {
return false;
}
}
QFileInfoList fileInfoList = sourceDir.entryInfoList();
if(m_firstRead) {
int isfileTMP = 0;
qDebug() << "a copyDirectoryFiles:" << fileInfoList.count();
foreach(QFileInfo fileInfo, fileInfoList){
if(fileInfo.isFile()) {
isfileTMP++;
}
}
m_total = fileInfoList.count() - 2 - isfileTMP; // 2为.和..
m_value = 0;
m_firstRead = false;
qDebug() << "a copyDirectoryFiles:" << fileInfoList.count() <<m_total << isfileTMP;
emit sigCopyDirStation(m_value/m_total);
if(m_value == m_total) {
m_firstRead = true;
emit sigCopyDirStation(1);
emit sigCopyDirOver();
}
}
else {
m_value++;
qDebug() << "a copyDirectoryFiles:" << m_value <<m_total;
emit sigCopyDirStation(m_value/m_total);
if((m_value/m_total == 1) || (m_value > m_total) || (m_value == m_total)) {
m_firstRead = true;
emit sigCopyDirOver();
}
}
foreach(QFileInfo fileInfo, fileInfoList){
if(fileInfo.fileName() == "." || fileInfo.fileName() == "..") {
continue;
}
if(fileInfo.isDir()){ //< 当为目录时递归的进行copy
if(!copyDirectoryFiles(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()), coverFileIfExist)) {
return false;
}
} else{ //当允许覆盖操作时,将旧文件进行删除操作
if(coverFileIfExist && targetDir.exists(fileInfo.fileName())){
targetDir.remove(fileInfo.fileName());
}
/// 进行文件copy
if(!QFile::copy(fileInfo.filePath(), targetDir.filePath(fileInfo.fileName()))){
return false;
}
else {
totalCopySize+=fileInfo.size();
emit sigSendExportProgressValue(totalCopySize);
}
// if(!copyFile(fromDir+MACRO_FENGEFU+fileInfo.fileName(),toDir+MACRO_FENGEFU+fileInfo.fileName())){
// return false;
// }
}
}
return true;
}
bool ThreadExportProgramPro::copyFile(const QString &fromFIleName, const QString &toFileName)
{
char* byteTemp = new char[4096];//字节数组
int fileSize = 0;
QFile tofile;
int iCurFileSize=0;
tofile.setFileName(toFileName);
QDataStream out(&tofile);
out.setVersion(QDataStream::Qt_4_8);
QFile fromfile;
fromfile.setFileName(fromFIleName);
if(!fromfile.open(QIODevice::ReadOnly)){
qDebug() << "open fromfile failed";
return false;
}
fileSize = fromfile.size();
QDataStream in(&fromfile);
in.setVersion(QDataStream::Qt_4_8);
while(!in.atEnd())
{
int readSize = 0;
//读入字节数组,返回读取的字节数量如果小于4096则到了文件尾
readSize = in.readRawData(byteTemp, 4096);
out.writeRawData(byteTemp, readSize);
totalCopySize += readSize;
iCurFileSize+=readSize;
emit sigSendExportProgressValue(totalCopySize);
}
if(iCurFileSize == fileSize){
tofile.setPermissions(QFile::ExeUser);
fromfile.close();
tofile.close();
return true;
}
else
return false;
}