复制文件的进度条

时间:2016-04-19 23:33:57

标签: c++ windows qt

我正在尝试在Qt中为文件副本创建进度条。 This尽可能接近,但我相信这不起作用,因为根据Qt类文档:

  

与其他QIODevice实现不同,例如QTcpSocket,QFile可以   不发出aboutToClose(),bytesWritten()或readyRead()信号。   此实现细节意味着QFile不适合   读取和写入某些类型的文件,例如设备文件   Unix平台。

我该怎么办?我不知道如何实现自己的信号。

这是我的代码:

void Replicator::anotbaandbFile(QDir source, QDir target)
{
    source.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);
    target.setFilter(QDir::Files | QDir::NoDotAndDotDot | QDir::NoSymLinks);

    qDebug() << "Scanning: " << source.path();

    QStringList sourceFileList = source.entryList();
    QStringList targetFileList = target.entryList();
    for (int aCount = 0; aCount < sourceFileList.count(); aCount++)
    {
        bool found = false;
        for (int bCount = 0; bCount < targetFileList.count(); bCount++)
            if (sourceFileList.at(aCount) == targetFileList.at(bCount))
                found = true;
        if (found == false)
        {

            sourceFile = new QFile(source.absolutePath()+"/"+sourceFileList.at(aCount));
            targetFile = new QFile(target.absolutePath()+"/"+sourceFileList.at(aCount));
            progressBar->setMinimum(0);
            progressBar->setMaximum(sourceFile->size());
            written = 0;
            connect(sourceFile,SIGNAL(bytesWritten(qint64)),SLOT(onWrite(qint64)));
            sourceFile->copy(targetFile->fileName());
            //QFile::copy(source.absolutePath()+"/"+sourceFileList.at(aCount), target.absolutePath()+"/"+sourceFileList.at(aCount));
            qDebug() << source.absolutePath()+"/"+sourceFileList.at(aCount) << " " << target.absolutePath()+"/"+sourceFileList.at(aCount);
        }
    }
}

void Replicator::onWrite(qint64 w)
{
    written += w;
    progressBar->setValue( written );
}

2 个答案:

答案 0 :(得分:2)

从上面修改的新代码

if (found == false)
        {
            sourceFile = new QFile(source.absolutePath()+"/"+sourceFileList.at(aCount));
            targetFile = new QFile(target.absolutePath()+"/"+sourceFileList.at(aCount));
            progressBar->setMinimum(0);
            progressBar->setMaximum(sourceFile->size());
            QByteArray buffer;
            for (int count = 0; !(buffer = sourceFile->read(1000000)).isEmpty(); count+=1000000)
            {
                targetFile->write(buffer);
                progressBar->setValue(count);
            }
            //targetFile->write(buffer);
            //QFile::copy(source.absolutePath()+"/"+sourceFileList.at(aCount), target.absolutePath()+"/"+sourceFileList.at(aCount));
            qDebug() << "copying " << sourceFile->fileName() << " to " << targetFile->fileName();
        }

答案 1 :(得分:1)

你可以简单地按照固定大小的部分复制大文件,而不是复制已经复制的部分,并通过将工作百分比分成几部分来计算工作百分比。

int iWorkPercentage = (int)(((float)iPortionsProcessed / (float)iOveralPortions) * 100);