【问题标题】:List files in sub-directories with QDir's filter使用 QDir 过滤器列出子目录中的文件
【发布时间】:2014-12-24 21:47:11
【问题描述】:

我正在寻找一个类似于python glob函数的函数。

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

我尝试了 entrylist,但它只能让我过滤当前文件夹中的内容。

【问题讨论】:

    标签: c++ qt glob qtcore qdir


    【解决方案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"
    

    【讨论】:

    • 是的,我可以这样做,或者使用条目列表然后手动过滤。我想知道是否有一个类似于 glob 的函数。
    • @eng3:这 执行此操作的单个函数。如果这是你所追求的,这个函数不是用 Qt 编写的。
    【解决方案2】:

    对于那些使用新版QT的人

    我的建议是,使用 [qdirEntryList][1]:

    1. 将根设置为root_directory
    2. 然后使用过滤器(png、jpj 或您需要的)搜索所有图像,然后
    3. 然后生成一个介于0和list.size()之间的伪随机数和
    4. 使用它作为获取图像路径的索引,
    5. 最终您将在您要返回的QImage 对象的构造函数中使用。

    【讨论】:

      猜你喜欢
      • 2023-03-03
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 2018-07-04
      • 2021-12-05
      • 2011-01-14
      • 1970-01-01
      相关资源
      最近更新 更多