void Downloader::download(const QUrl &from, const QUrl &to) { if (to.isLocalFile()) { QFile fileTarget(to.path()); fileTarget.remove(); } KIO::CopyJob *copyJob = KIO::copyAs(from, to, KIO::Overwrite | KIO::HideProgressInfo); copyJob->setUiDelegate(0); copyJob->setAutoDelete(true); connect (copyJob, SIGNAL(copyingDone(KIO::Job*,QUrl,QUrl,time_t,bool,bool)), this, SLOT(copyingDone(KIO::Job*,QUrl,QUrl,time_t,bool,bool))); }
bool FileSystemManager::copyFile(QString source, QString target, qint64 totalSize, bool cut) { QFile fileSource(source); QFile fileTarget(target); fileSource.open(QFile::ReadOnly); fileTarget.open(QFile::WriteOnly); char block[BLOCK_SIZE]; qint64 total = fileSource.size(); qint64 steps = total >> 7; //shift right 7, same as divide 128, much faster qint64 bytesCopied = 0; while(!fileSource.atEnd()) { if(m_cancel) break; qint64 inBytes = fileSource.read(block, sizeof(block)); fileTarget.write(block, inBytes); bytesCopied += inBytes; if(bytesCopied > steps) { emit updateCopyProgress(target, bytesCopied, totalSize); bytesCopied = 0; } } emit updateCopyProgress(target, bytesCopied, totalSize); fileTarget.close(); fileSource.close(); if(fileTarget.size() != total) return false; if(cut) fileSource.remove(); //if file is cut remove the source return true; }