Qt递归获取指定文件夹下的所有文件

方法一

使用类QDirIterator来进行遍历。简介
在这里插入图片描述大概是说,适合于大目录遍历,支持递归但是不支持排序。
在这里插入图片描述QDirIterator::NoIteratorFlags默认值,没有标志,迭代器将返回path符合QDir::Filters的条目。
QDirIterator::Subdirectories同时列出所有子文件下符合QDir::Filters规则的条目

QDirIterator it(dirPath, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot | QDir::AllDirs);

返回目录下的所有文件和子文件目录,不包括文件链接和. ..

QDirIterator it(dirPath, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot);

返回目录下所有文件(此时没有子文件文件目录),不包括文件链接和. ..
代码

void Widget::on_pushButton_clicked()
{
    QStringList list;
    QString dirPath = "F:\\dirTest";
    QDirIterator it(dirPath, QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot | QDir::AllDirs, QDirIterator::Subdirectories);
    while(it.hasNext())
    {
        it.next();
        if(it.fileInfo().suffix() == "icd")
        {
            list.append(it.fileInfo().absoluteFilePath());
        }
    }
    foreach(QString str, list)
    {
        qDebug() << str;
    }
}

输出

"F:/dirTest/nihao/qunimade/max.icd"
"F:/dirTest/nihao/明天.icd"
"F:/dirTest/tayehao/nihao.icd"
"F:/dirTest/wobuhao.icd"

方法二

使用QDir类的 entryInfoList
在这里插入图片描述这个比较强大,可以指明要遍历的文件名,以及遍历的标准和排序功能。至于entryInfoListentryList他们的关系是entryInfoList返回的是QFileInfoList我们一般使用前者,因为QFileInfo有很多方便的接口。
需要注意的地方
1.如何让entryInfoList返回所有的条目(包括子文件夹下的条目),至少需要指明QDir::AllDirs。只是文档并没有直说的地方(至少我觉得)。
2.默认参数 Filters filters = NoFilter并不是说什么都不列出。而是
A default constructed QDir will not filter out files based on their permissions, so entryList() and entryInfoList() will return all files that are readable, writable, executable, or any combination of the three. This makes the default easy to write, and at the same time useful.会返回可读或可写或可执行。或者符合这三个任意组合的文件或文件目录条目。
代码

void Widget::getAllFiles(const QString &dirPath)
{
    QDir dir(dirPath);
    QFileInfoList list = dir.entryInfoList(QDir::Files | QDir::AllDirs | QDir::NoSymLinks | QDir::NoDotAndDotDot);
    foreach(QFileInfo fileInfo, list)
    {
        if(fileInfo.isDir())
        {
            getAllFiles(fileInfo.absoluteFilePath());
        }
        else
        {
            fileList.append(fileInfo.absoluteFilePath());
        }
    }
}

输出

"F:/dirTest/nihao/qunimade/max.icd"
"F:/dirTest/nihao/明天.icd"
"F:/dirTest/tayehao/nihao.icd"
"F:/dirTest/wobuhao.icd"

技巧
在这里插入图片描述
QDirIterator构造函数参数 nameFilters 是可以支持一些简单的正则表达式的。就上面的例子(寻找某一个文件下说有以.icd)结尾的文件还可以这样写。
代码

   QString dirPath = "F:\\dirTest";
    QStringList list;
    QDirIterator it(dirPath, QStringList() << "*.icd", QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);
    while(it.hasNext())
    {
        it.next();
        list.append(it.fileInfo().absoluteFilePath());
    }
    foreach(QString str, list)
    {
        qDebug() << str;
    }

输出

"F:/dirTest/nihao/qunimade/max.icd"
"F:/dirTest/nihao/明天.icd"
"F:/dirTest/tayehao/nihao.icd"
"F:/dirTest/wobuhao.icd"

修改为

QDirIterator it(dirPath, QStringList() << "*hao.icd", QDir::Files | QDir::NoSymLinks | QDir::NoDotAndDotDot, QDirIterator::Subdirectories);

输出

"F:/dirTest/tayehao/nihao.icd"
"F:/dirTest/wobuhao.icd"
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值