【问题标题】:QDirIterator - Skip Folders and its subfoldersQDirIterator - 跳过文件夹及其子文件夹
【发布时间】:2019-01-02 13:25:33
【问题描述】:

如何使用 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());
}

但它只忽略特定文件夹而不是其子目录。 有什么想法吗?

【问题讨论】:

  • 您的问题到底是什么?是否要遍历所有文件夹和子文件夹以查找 .h 文件?
  • 是的,我想在我的文件夹和子文件夹中查找所有 h 文件。但是我有一个我不想搜索的文件夹列表。这个文件夹的子文件夹也应该被忽略。
  • 我会给你答案,请稍等......
  • 我做到了,我改了答案,效果很好!!!
  • 你的迭代器在循环中前进了两次。

标签: c++ qt directory


【解决方案1】:

以下指令 100% 有效:

这个方法QString QDirIterator::next() 将迭代器前进到下一个条目,并返回这个新条目的“文件路径”。如果hasNext()返回false,这个函数什么也不做,返回一个null QString

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

因此,我不得不编写一个函数作为目录解析器,如下所示:

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());

所以试试这个(cmets 中的通知):

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

【讨论】:

  • 感谢您的回答,但我无法正常工作。也许我的意图没有得到准确的解释。我正在搜索目录及其子目录中的所有 *.h-Files。但我想在搜索 h 文件时排除一些目录及其子目录。
  • @woidler 这是一个新的答案,它绝对有效
【解决方案2】:

我知道这有点旧,但您的原始代码很接近......有两个问题。首先,迭代器覆盖每个条目,它返回的是完整路径和文件名,而不仅仅是当前目录中的条目名称。检查完全匹配是问题而不是遏制。第二个问题是你有两次调用“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”返回的值,您会更好地了解如何将您排除的内容与当前条目进行比较,因此只需调整字符串比较以获得您想要的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-24
    • 2020-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多