#include "work.h"
#include <QFile>
#include <QFileInfo>
#include <QCoreApplication>
#include <QDebug>
#include <QThread>
ReadWork::ReadWork(QObject *parent) : QObject(parent),QRunnable()
{
filePath = "";
this->setAutoDelete(false);
status = AppConfig::TransferState::None;
}
ReadWork::~ReadWork()
{
qDebug()<<__FUNCTION__<<QThread::currentThreadId();
}
void ReadWork::run()
{
//判断文件是否存在
QFileInfo fileInfo(filePath);
if(!fileInfo.exists())
{
emit msgTips("文件不存在!");
return;
}
quint64 sourceFileSize = fileInfo.size();
quint64 fileSize = (AppConfig::lastUnexpectedFileName.isEmpty())? 0 : AppConfig::unexpectedFileSize;//已经传输的字节
quint64 filePos = AppConfig::unexpectedFilePos;
//获得文件信息
QString fileInfoStr = QString("%1|%2|%3|%4|%5")
.arg(fileInfo.fileName()).arg(sourceFileSize).arg(fileInfo.absoluteFilePath())
.arg(fileInfo.suffix()).arg(fileSize);
emit sendFileInfo(fileInfoStr);
emit msgTips(fileInfoStr);
//打开文件
QFile file(filePath);
if(!file.open(QIODevice::ReadOnly))
{
emit msgTips(QString("文件打开失败!%1。").arg(file.errorString()));
return;
}
QByteArray data;//存储发送的数据
//移动文件指针
file.seek(filePos);
//读取文件
while(!file.atEnd())
{
//取消
if(status != AppConfig::TransferState::Canceled)
{
//意外关闭
if(status == AppConfig::TransferState::Unexpected)
{
//记住文件名称
AppConfig::lastUnexpectedFileName = filePath;
//记住已经传输的字节
AppConfig::unexpectedFileSize = fileSize;
//记住文件指针的位置,方便下次传输
AppConfig::unexpectedFilePos = file.pos();
AppConfig::writeConfig();
file.close();
return;
}
//暂停
if(status != AppConfig::TransferState::Paused)
{
int readSize = (sourceFileSize-file.pos()<DATA_SIZE)?(sourceFileSize-file.pos()):DATA_SIZE;
data = file.read(readSize);
fileSize += data.size();
int pgBarStep = static_cast<int>(fileSize*100/sourceFileSize);
emit updatePgBar(pgBarStep);
emit sendData(data);
QThread::msleep(100);
}
else
{
QThread::msleep(100);
}//if(status != AppConfig::TransferState::Paused)
}
else
{
file.close();
emit updatePgBar(0);
emit msgTips("取消文件传输!");
return;
}
}
file.close();
emit msgTips("读取完毕!");
}
void ReadWork::getFile(const QString &filePath)
{
this->filePath = filePath;
}
void ReadWork::setStatus(const AppConfig::TransferState &status)
{
this->status = status;
}
WriteWork::WriteWork(QObject *parent) : QObject(parent),QRunnable()
{
filePath = "";
fileInfo = "";
arryList.clear();
this->setAutoDelete(false);
}
WriteWork::~WriteWork()
{
qDebug()<<__FUNCTION__<<QThread::currentThreadId();
}
void WriteWork::run()
{
//如果文件路径为空,则使用当前应用程序所在路径
if(filePath.isEmpty())
filePath = QCoreApplication::applicationDirPath();
//创建文件
QFile file;
quint64 sourceFileSize = 0;
quint64 currentFileSize = 0;
QString fileName="";
//获取并解析文件信息
if(fileInfo.isEmpty())
{
emit msgTips("未收到文件信息");
return;
}
QStringList fileInfos = fileInfo.split("|");
currentFileSize = fileInfos.last().toUInt();
fileName = fileInfos.at(0);
sourceFileSize = fileInfos.at(1).toInt();
//判断文件是不是重传文件
if(currentFileSize > 0)
{
fileName = AppConfig::lastUnexpectedTargetFileName;
file.setFileName(fileName);
file.rename(fileName.chopped(4));
}
else
{
//设置文件相关信息
file.setFileName(filePath+"/"+fileName);
}
emit msgTips("设置文件路径和名称完毕!");
//打开文件
if(!file.open(QIODevice::ReadWrite))
{
emit msgTips("文件打开失败:"+file.errorString());
return;
}
emit msgTips("文件打开成功!");
//写入数据
file.seek(currentFileSize);
while(sourceFileSize-currentFileSize>0)
{
//意外关闭-等待旧数据处理完毕才能执行
if(status == AppConfig::TransferState::Unexpected && arryList.isEmpty())
{
file.close();
//更改文件名称-在文件后缀中增加.tmp
if(file.fileName().count(".tmp")>0)
return;
file.rename(file.fileName()+".tmp");
AppConfig::lastUnexpectedTargetFileName = file.fileName();
AppConfig::writeConfig();
return;
}
//取消
if(status == AppConfig::TransferState::Canceled)
{
file.close();
file.remove();
arryList.clear();
emit msgTips("文件取消传输");
emit updatePgBar(0);
if(!AppConfig::lastUnexpectedTargetFileName.isEmpty())
{
QFile::remove(AppConfig::lastUnexpectedTargetFileName);
//重置
AppConfig::lastUnexpectedFileName ="";
AppConfig::lastUnexpectedTargetFileName ="";
AppConfig::unexpectedFileSize = 0;
AppConfig::unexpectedFilePos = 0;
AppConfig::writeConfig();
}
return;
}
//按下暂停键,且数据处理完,才能暂停
if(status == AppConfig::TransferState::Paused && arryList.isEmpty())
{
//暂停
QThread::msleep(100);
continue;
}
//防止出现新数据没到,但是旧数据已经处理完
if(arryList.isEmpty())
continue;
QByteArray fileData = arryList.takeFirst();
quint64 size = file.write(fileData,fileData.size());
currentFileSize += size;
int step = static_cast<int>((currentFileSize*100)/sourceFileSize) ;
emit updatePgBar(step);
QThread::msleep(100);
}//while
file.close();
emit msgTips("写入完毕!");
if(!AppConfig::lastUnexpectedTargetFileName.isEmpty())
{
QFile::remove(AppConfig::lastUnexpectedTargetFileName);
//重置
AppConfig::lastUnexpectedFileName ="";
AppConfig::lastUnexpectedTargetFileName ="";
AppConfig::unexpectedFileSize = 0;
AppConfig::unexpectedFilePos = 0;
AppConfig::writeConfig();
}
}
void WriteWork::getPath(const QString &filePath)
{
this->filePath = filePath;
}
void WriteWork::setStatus(const AppConfig::TransferState &status)
{
this->status = status;
}
void WriteWork::getData(const QByteArray &data)
{
arryList<<data;
}
void WriteWork::getFileInfo(const QString &data)
{
fileInfo = data;
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
readWriteFile.zip (11个子文件)
readWriteFile
appconfig.h 943B
appconfig.cpp 2KB
mainwindow.h 937B
mainwindow.cpp 7KB
readWriteFile.pro 1KB
main.cpp 238B
mainwindow.ui 6KB
bin
rwf.exe 67KB
rwf.ini 166B
work.h 1KB
work.cpp 7KB
共 11 条
- 1
资源评论
m晴朗
- 粉丝: 7043
- 资源: 110
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功