#include "filesplitter.h" FileSplitter::FileSplitter(QString fileName,QString fileID,int unit) { this->fileName = fileName; this->unit = unit; this->outputDir = QDir::tempPath()+"/sncsplit"; this->fileID = fileID; } QStringList FileSplitter::getSplitResult() { QStringList results; if(!prepare()) return results; QDir dir(this->outputDir); QFileInfoList list = dir.entryInfoList(QDir::Files,QDir::Name); for(int i=0;irawData.length(); int pos = 0; int len = this->unit; int index = 0; QString packkey = getRandPackKey(); QFileInfo fileinfo(this->fileName); QString basename = fileinfo.fileName(); int count = (size % this->unit==0)? (size / this->unit) : size / this->unit + 1; while(1) { index++; QByteArray packData = this->rawData.mid(pos,len); QString outname = QString("%1/%2.%3_%4_%5_%6") .arg(this->outputDir) .arg(basename) .arg(packkey) .arg(QString::number(count)) .arg(QString("000000000"+QString::number(index)).right(10)) .arg(this->checksum); QFile packFile(outname); if(packFile.open(QIODevice::WriteOnly)) { if(packFile.write(packData)==packData.size()) { results<= size) break; } if(results.size()!=index) { for(int i=0;ifileName); if(!file.open(QIODevice::ReadOnly)) { return false; } this->rawData = file.readAll(); this->checksum = QCryptographicHash::hash ( this->rawData, QCryptographicHash::Md5 ).toHex(); file.close(); QDir dir; if(!dir.exists(this->outputDir + "/" + this->checksum + "_" + this->fileID)) { if(!dir.mkpath(this->outputDir + "/" + this->checksum + "_" + this->fileID)) { return false; } } this->outputDir += "/" + this->checksum + "_" + this->fileID; return true; } QString FileSplitter::getRandPackKey() { QTime time; time = QTime::currentTime(); qsrand(time.msec()+time.second()*10000); int v = 100000 + qrand()%899999; return QString::number(v); } void FileSplitter::cleanup() { qDebug()<outputDir; if(this->checksum.isEmpty()) return ; QDir dir(this->outputDir); QFileInfoList list = dir.entryInfoList(QDir::Files,QDir::Name); for(int i=0;ioutputDir); }