在qt中迭代文件夹中的文件非常慢

时间:2015-02-26 15:17:37

标签: c++ performance qt

我正在遍历文件夹中的所有文件(递归地通过它的所有子文件夹),但这非常慢......几乎永远不会返回。我可以把它放在一个线程中,但即使比这速度也不实用。这是我的功能

int MainWindow::searchXmlFiles(QString rootDir)
{
    xmlFileModel->clear(); // xmlFileModel is QStanardItemModel

    int count = 0;

    XmlFile xmlFile;
    QString xmlFilePath;

    QDirIterator iter( rootDir, QStringList() << "*.xml", QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);

    QDir dir( ui->lineEditSourceFolder->text() );

    while(iter.hasNext() )
    {
        qDebug() << iter.next();

        xmlFilePath = iter.filePath();

        xmlCollection = xmlFile.openXmlFile( xmlFilePath );

        QStandardItem * item = new QStandardItem( QIcon(":/icons/xmlfile.ico") , dir.relativeFilePath( xmlFilePath) );

        xmlFileModel->appendRow( item );

        count++;
    }

    QString fileCount = QString("Total of %1 file(s) will be converted from `%2` folder").arg( QString::number(count), rootDir);

    ui->labelXmlFileCount->setText( fileCount );

    return count;
}

这种速度真的很低吗?有没有办法更快地做同样的事情?

更新

在Jeremey评论之后,如果我评论循环内部的所有工作(xmlFile.openXmlFile()和QStandardItem创建),它会变得非常快,需要3秒钟。如果我在那里创建QStandardItem,大约需要7秒/

1 个答案:

答案 0 :(得分:1)

您可以使用QDir :: entryList()一次获取XML文件的完整列表,然后遍历文件名的QStringList。