QT遍历文件夹下的所有文件

文章目录

    • 方法一
      • 代码
    • 方法二
      • 需要注意的地方
      • 代码
    • 技巧
    • 代码

方法一

使用类QDirIterator来进行遍历。简介
在这里插入图片描述
大概是说,适合于大目录遍历,支持递归但是不支持排序。
QT遍历文件夹下的所有文件_第1张图片
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
QT遍历文件夹下的所有文件_第2张图片
这个比较强大,可以指明要遍历的文件名,以及遍历的标准和排序功能。至于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"

技巧

QT遍历文件夹下的所有文件_第3张图片
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"

你可能感兴趣的:(我的QT,qt,开发语言)