QDirIterator-跳过文件夹及其子文件夹

时间:2018-07-25 16:31:39

标签: c++ qt directory

如何使用QDirIterator跳过文件夹? 我已经尝试过:

QString nameFilter = "*.h";
QDirIterator dirIterator(folder, nameFilter, QDir::Files, QDirIterator::Subdirectories);
QString str("folder");
QStringList filenames;

while (dirIterator.hasNext())
{            
    if(dirIterator.next() == str) continue;

    filenames.append(dirIterator.next());
}

,但它仅忽略特定文件夹,而不忽略其子目录。 有想法吗?

2 个答案:

答案 0 :(得分:1)

下面的指令可以100%工作:

此方法QString QDirIterator::next()将迭代器前进到下一个条目,并返回此新条目的“文件路径”。如果hasNext()返回false,则此函数不执行任何操作,并返回null QString

如果QDirIterator找到了具有特定filter(基于const QStringList &nameFilters参数的文件)的文件,则QDirIterator::next()返回“ file-path”,您将无法比较整个“ file-路径”和“跳过文件夹”进行迭代!

因此,我不得不像下面这样写一个函数作为目录解析器:

QStringList Widget::getCurrDirsOfFile(const QFileInfo &file_info, const QString &default_folder)
{
    QString file_path = file_info.filePath();
    QString file_name = file_info.fileName();
    file_path.truncate(file_path.lastIndexOf("/" + file_name));

    file_path = file_path.mid(file_path.lastIndexOf("/") + 1);

    return file_path;
}

此函数获取“文件路径”,并像下面这样返回其最后一个“文件夹名称”:

input : /home/msi/Desktop/123/untitled/123/widget.h
output(list) : 123, 123

我们有QString skiped_dir("untitled");个跳过的文件夹!

在这种状态下,当您获得123“文件夹名称”之外的内容时,可以将该文件附加到QStringList filenames上:

if(folder_list.indexOf(QRegExp(skiped_dir)) == -1)
        filenames.append(it.filePath());

所以尝试一下(注释中的提示):

void Widget::btn_iterate_clicked()
{
    // folder to iterate
    QString folder("/home/msi/Desktop/");

    // folder-name you want to skip
    QString skiped_dir("untitled");

    // file-names which are match with .h filter stored in filenames list
    QStringList filenames;

    // this list used in QStringList getCurrDirsOfFile() method
    QStringList folder_list;

    // iterator
    QDirIterator it(folder, QStringList() << "*.h" , QDir::Files, QDirIterator::Subdirectories);
    while (it.hasNext())     // if next object exist for iterate
    {
        // we have the file with .h extension
        it.next();

        // get previous folders that exist in filepath address of it.fileInfo()
        folder_list = getCurrDirsOfFile(it.fileInfo(), folder);

        // if folder_list contained skiped folder then reject that or appent it
        if(folder_list.indexOf(QRegExp(skiped_dir)) == -1)
            filenames.append(it.filePath());
    }

    for(int i = 0;i < filenames.count();i++)
    {
        QMessageBox::information(this, "", filenames.at(i));
    }
}

假设我们有波纹树(目录):

该程序仅显示:

/home/msi/Desktop/build-untitled-Desktop_Qt_5_0_2_GCC_64bit-Debug/ui_widget.h
/home/msi/Desktop/1/1.h

enter image description here

答案 1 :(得分:0)

我知道这有点旧,但是您的原始代码已经关闭了……有两个问题。首先,迭代器覆盖每个条目,返回的是完整路径和文件名,而不仅仅是当前目录中的条目名称。问题是检查精确匹配而不是遏制问题。第二个问题是您有两个调用“ next”的调用,而没有在它们之间调用“ hasNext”的调用,因此很可能会崩溃。

while (dirIterator.hasNext())
{      
    QString fname = dirIterator.next ();

    if (fname.contains (str)) continue;

    filenames.append (fname);
}

请注意,您可能需要更具体地使用“ str”的值。任何文件名都可以包含“ folder”一词,因此您可能要检查str.endsWith(“ / folder”)和str.contains(“ / folder/")。

如果您检查从“ next”返回的值,则最好查看如何将排除的内容与当前条目进行比较,因此只需调整字符串比较即可获得所需的内容。