#include "updatecontroller.h" UpdateController::UpdateController(DataParser *parser, QObject *parent) : QObject(parent) { this->dataParser = parser; localPath = QDir::currentPath() + "/Application"; } void UpdateController::CalculateHash() { qDebug() << "Try calculate"; QDirIterator iterator(localPath,QDirIterator::Subdirectories); fileDataList.clear(); QList *files = new QList; QList * folders = new QList; if(!QDir("Application").exists()){ //проверка на наличие папки QDir().mkdir("Application"); } QDir dir(localPath); QString hashString; while (iterator.hasNext()) { iterator.next(); QFileInfo fileInfo = iterator.fileInfo(); FileData currentFile; QFile file(fileInfo.absoluteFilePath()); quint64 fileSize = file.size(); //буффер для хэширования крупных файлов const quint64 bufferSize = 10240; if(fileInfo.isHidden()) continue; if(fileInfo.isFile() && file.open(QIODevice::ReadOnly)) { char buffer[bufferSize]; int bytesRead; int readSize = qMin(fileSize,bufferSize); QCryptographicHash hash(QCryptographicHash::Md5); while(readSize > 0 && (bytesRead = file.read(buffer,readSize)) > 0){ fileSize -= bytesRead; hash.addData(buffer,bytesRead); readSize = qMin(fileSize,bufferSize); } hashString = QString(hash.result().toHex()); currentFile.path = Tools::CreateLocalPath(fileInfo.absoluteFilePath()); currentFile.hash = hashString; files->push_back(currentFile); } else if (fileInfo.isDir() && !fileInfo.isRoot() && fileInfo.fileName() != "..") { currentFile.path = Tools::CreateLocalPath(fileInfo.path()); currentFile.hash = "FOLDER"; if(!folders->contains(currentFile)){ folders->push_back(currentFile); } } } fileDataList.append(*folders); fileDataList.append(*files); dataParser->CreateXML(fileDataList); delete folders; delete files; } UpdateController::~UpdateController() { }