Список файлов в подкаталогах с фильтром QDir

Я ищу функцию, похожую на функцию глобуса Python.

If my folder structure is:
folder1/abc1.txt
folder1/xyz1.txt
folder1/abc2.txt
folder2/abc3.txt
folder2/xyz4.txt
folder3/abc5.txt

тогда если я дам */abc*Я ищу вывод:

folder1/abc1.txt
folder1/abc2.txt
folder2/abc3.txt
folder3/abc5.txt

Я попробовал список записей, но он позволяет фильтровать содержимое текущей папки.

1 ответ

Решение

Конечно, вы можете проходить рекурсивно с помощью встроенного цикла:

main.cpp

#include <QDir>
#include <QFileInfoList>
#include <QString>
#include <QStringList>
#include <QDebug>

void traverse(const QString &pattern, const QString &dirname, int level)
{
    QDir dir(dirname);
    dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoSymLinks | QDir::NoDot | QDir::NoDotDot);

    static const QStringList stringList = pattern.split('/');
    foreach (QFileInfo fileInfo, dir.entryInfoList(stringList.mid(level, 1))) {
        if (fileInfo.isDir() && fileInfo.isReadable())
            traverse(pattern, fileInfo.filePath(), level+1);
        else if (stringList.size() == (level + 1))
            qDebug() << fileInfo.filePath();
    }
}

int main()
{
    traverse("*/abc*", ".", 0);
    return 0;
}

main.pro

TEMPLATE = app
TARGET = main
QT = core
SOURCES += main.cpp

Построить и запустить

qmake && make && ./main

Выход

"./folder1/abc1.txt"
"./folder1/abc2.txt"
"./folder2/abc3.txt"
"./folder3/abc5.txt"

Для тех, кто использует новую версию QT

я предлагаю использовать [qdirEntryList][1]:

  1. установить корень на root_directory
  2. затем выполните поиск всех изображений с помощью фильтра (png, jpj или что вам нужно) и
  3. затем сгенерируйте псевдослучайное число от 0 до list.size() а также
  4. используйте это как индекс для получения пути к изображению,
  5. что, наконец, вы будете использовать в конструкторе QImage Объект, который вы собираетесь вернуть.
Другие вопросы по тегам