递归遍历目录并收集所有xml文件

时间:2018-04-01 13:20:01

标签: c++ qt

我正在尝试遍历给定的目录路径并且继续收集所有xml文件。但是,出于某种原因,我的结果只返回部分文件路径而不是所有文件路径。我不确定我的错误在哪里。

如果你们建议我不使用qtiterator并使用其他方法也可以。

enter image description here

QList<QDomNode> collect_library_nodes (const QString &path) {

    // collect all xml files
    QDir dir(path);
    dir.setFilter(QDir::AllDirs | QDir::Files | QDir::Hidden | QDir::NoDotAndDotDot);
    dir.setNameFilters(QStringList("*.xml"));

    QList<QString> filepaths;
    QDirIterator it(dir, QDirIterator::Subdirectories);
    while(it.hasNext()) {
        qDebug() << "FILE" << it.next();
        filepaths.append(it.next());
    }

    qDebug() << 'COUNT:' << filepaths.count();

    // collect xml nodes
    QList<QDomNode> library_nodes;

    return library_nodes;
}

当我运行程序时,由于子文件夹中有xml文件,因此我得到的文件数为15而不是27。

这是当前的输出:

Debugging starts
FILE: "C:/Users/Martini/Desktop/trash/master/a.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/c.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/e.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_a"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_b"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_c"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_d"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_e"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_e/r.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_f/s.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_g"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_g/v.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_g/x.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/h.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/j.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/l.xml"
COUNT: 16

它应该输出:

Debugging starts
FILE: "C:/Users/Martini/Desktop/trash/master/a.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/b.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/c.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/d.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/e.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/f.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/g.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/h.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/i.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/j.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/k.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/l.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_a/m.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_b/n.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_c/o.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_d/p.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_e/q.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_e/r.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_f/s.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_f/t.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_g/u.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_g/v.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_g/w.xml"
FILE: "C:/Users/Martini/Desktop/trash/master/folder_g/x.xml"
COUNT: 24

1 个答案:

答案 0 :(得分:2)

您在循环中调用it.next()两次。因此,您跳过每个第二个文件。换句话说,您在奇数位置输出每个文件路径并在偶数位置收集每个文件路径。

while(it.hasNext()) {
    qDebug() << "FILE" << it.next();
    filepaths.append(it.next());
}

应该如下所示:

while(it.hasNext()) {
    const auto& fn = it.next();
    qDebug() << "FILE" << fn;
    filepaths.append(fn);
}

或者:

while(it.hasNext()) {
    qDebug() << "FILE" << it.next();
    filepaths.append(it.filePath());
}