Qt学习-QFileInfoList遍历文件夹以及过滤文件

本文介绍了一种使用Qt实现的递归遍历文件夹的方法,并展示了如何筛选特定格式(如JPG)的文件。通过示例代码详细解释了遍历过程及文件类型过滤的技术细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//递归遍历文件夹
QFileInfoList ListWidget::GetFileList(QString path)
{
    QDir dir(path);

    //列出dir(path)目录文件下所有文件和目录信息,存储到file_list容器
    QFileInfoList file_list = dir.entryInfoList(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    //列出dir(path)目录下所有子文件夹
    QFileInfoList folder_list = dir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
    //进行子文件夹folder_list递归遍历,将内容存入file_list容器
    for(int i= 0; i != folder_list.size(); i++)
    {
        QString name = folder_list.at(i).absoluteFilePath();
        QFileInfoList child_file_list = GetFileList(name);
        file_list.append(child_file_list);
    }
    return file_list;
}

过滤文件,筛选出文件夹下jpg格式的文件

    QStringList fileList;
    QString filter;

    //遍历文件夹获取文件信息,存入到容器file_info_list
    QFileInfoList file_info_list = GetFileList("File");     //使用File相对路径
      //GetFileList("C:\\Users\\Administrator\\Desktop\\File")    //绝对路径表示

    //foreach遍历容器file_in_list,进行过滤筛选,将过滤结果输入到fileList容器
    //筛选PPT文件
    /*foreach(variable, container)是Qt定义的一个宏,
      它的作用是遍历QList容器类变量container,并依次把列表项存放在变量variable中。
    */
    foreach(QFileInfo fileinfo, file_info_list)
    {
        //_filter = _fileinfo.completeSuffix();
        filter = fileinfo.suffix();    //后缀名
        if( (filter != "jpg") && (filter != "jpeg") &&(filter != "png") )
        {
            continue;
        }
        fileList.append(fileinfo.absoluteFilePath());
    }


<think>好的,我现在需要解决用户的问题:如何在Qt遍历文件夹下的所有文件,并给出示例代码。用户已经提供了一些相关的引用内容,我需要先仔细阅读这些引用,看看有没有可以直接利用的信息。 首先,引用[1]提到使用QDir的entryList()函数获取所有文件名,然后遍历文件名列表,过滤出子文件夹。这里的关键点是entryList()和entryInfoList()的使用,以及设置过滤器QDir::Dirs和QDir::NoDotAndDotDot来排除当前目录和上级目录的符号链接。不过用户的需求是遍历所有文件,而不仅仅是子文件夹,所以可能需要调整过滤器。 引用[2]展示了如何创建文件夹,但用户的问题是关于遍历文件,这部分可能暂时用不上。不过提到的QFileInfo和exists()检查可能在遍历过程中有用,比如判断是否是文件或目录。 引用[3]是关于Linux下C/C++遍历文件夹的方法,使用了opendir()等系统调用。但用户明确要求Qt的方法,所以这部分可能作为背景知识,但不需要直接使用。 引用[4]给出了一个具体的例子,路径是“D:/.../FILE”,其中包含一个A.txt文件。这可能说明用户需要处理特定路径下的所有文件,包括子目录中的文件。 接下来,我需要综合这些信息,找到Qt遍历所有文件(包括子文件夹)的正确方法。根据Qt文档,递归遍历文件夹通常需要使用递归函数,或者QDirIterator。QDirIterator可以设置QDirIterator::Subdirectories标志来遍历子目录,这可能是一个更高效的方法。 在引用[1]中,用户使用了entryInfoList()来获取文件信息列表,然后遍历每个QFileInfo对象。如果结合递归,就可以处理子文件夹中的文件。但如果是用QDirIterator的话,可能代码更简洁。 比如,使用QDirIterator的示例代码可能如下: QDirIterator it("folder_path", QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (it.hasNext()) { QString filePath = it.next(); QFileInfo fileInfo(filePath); // 处理文件 } 这样就能遍历所有子目录下的文件。同时需要设置过滤器为QDir::Files,并且包含QDirIterator::Subdirectories选项。另外,用户可能需要完整的文件路径,所以使用entryInfoList()或者QDirIterator的next()返回的路径是否包含完整路径需要考虑。 引用[1]中的示例代码遍历的是子文件夹,而用户需要的是所有文件,所以需要调整过滤器,将QDir::Dirs改为QDir::Files,或者同时包含两者?不,用户需要的是所有文件,包括子文件夹中的文件,所以可能需要递归遍历每个子目录,或者使用QDirIterator来简化这个过程。 另外,需要处理绝对路径还是相对路径?用户示例中的引用[4]显示的是绝对路径,所以可能需要获取文件的绝对路径,使用QFileInfo的absoluteFilePath()或者QDirIterator直接返回完整路径。 综上,正确的做法可能是使用QDirIterator,设置Subdirectories标志,并过滤文件。示例代码可能如下: QDirIterator it("folder_path", QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); while (it.hasNext()) { QString filePath = it.next(); QFileInfo fileInfo(filePath); qDebug() << "文件路径:" << fileInfo.absoluteFilePath(); } 或者,如果使用递归函数的方法,可能需要像这样: void listFilesRecursively(const QString &path) { QDir dir(path); QFileInfoList entries = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); foreach(const QFileInfo &entry, entries) { if (entry.isDir()) { listFilesRecursively(entry.absoluteFilePath()); } else { qDebug() << "文件:" << entry.absoluteFilePath(); } } } 这两种方法都可以实现遍历所有文件,包括子文件夹中的文件。用户可能需要根据具体情况选择合适的方法。QDirIterator的方法更简洁,而递归函数的方法可能在处理复杂逻辑时更灵活。 接下来,需要检查用户提供的引用是否有相关的代码。引用[1]中的代码是遍历文件夹名称,而用户需要遍历文件,所以需要调整过滤器。例如,设置QDir::Files来获取文件,或者同时包含文件和目录,但需要进一步判断是否是文件。 例如,使用entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot),然后遍历每个条目,如果是目录则递归处理,否则处理文件。 在示例代码中,可能需要展示这两种方法,并说明各自的优缺点。例如,QDirIterator更简单,递归方法更灵活。 现在,用户的问题是需要示例代码,因此需要给出这两种方法的代码示例,并解释各自的适用场景。同时,需要确保代码正确,符合Qt的语法和用法。 最后,根据引用[1],用户可能已经了解entryInfoList的使用,所以可以结合这一点来展示递归遍历的方法。而引用[4]中的示例可能是一个简单的遍历,但没有递归处理子文件夹。 因此,正确的示例代码应该包括两种方法,并说明如何获取所有文件的路径。同时,需要处理路径的正确性,避免出现相对路径的问题。在代码中,使用QDir的绝对路径方法,如absoluteFilePath(),确保路径正确。 总结,回答应包含两种方法的示例代码:一种是使用QDirIterator,另一种是递归函数。同时,说明如何设置过滤器和处理子目录,确保获取所有文件。</think>在Qt遍历文件夹下所有文件可以通过`QDirIterator`或递归函数实现。以下是两种方法的示例代码及说明: --- ### 方法一:使用QDirIterator(推荐) ```cpp #include <QDirIterator> #include <QDebug> void listAllFiles(const QString& folderPath) { QDirIterator it(folderPath, QDir::Files | QDir::NoDotAndDotDot, QDirIterator::Subdirectories); // 遍历文件夹 while (it.hasNext()) { QString filePath = it.next(); QFileInfo fileInfo(filePath); qDebug() << "文件路径:" << fileInfo.absoluteFilePath(); } } ``` - **参数说明**: - `QDir::Files`: 仅遍历文件- `QDir::NoDotAndDotDot`: 排除`.`(当前目录)和`..`(上级目录)。 - `QDirIterator::Subdirectories`: 递归遍历文件夹[^1]。 - **优点**: 代码简洁,无需手动处理递归逻辑。 --- ### 方法二:递归遍历 ```cpp #include <QDir> #include <QFileInfo> #include <QDebug> void listFilesRecursively(const QString& path) { QDir dir(path); dir.setFilter(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); QFileInfoList entries = dir.entryInfoList(); for (const QFileInfo& entry : entries) { if (entry.isDir()) { listFilesRecursively(entry.absoluteFilePath()); // 递归处理子文件夹 } else { qDebug() << "文件名:" << entry.fileName() << "路径:" << entry.absoluteFilePath(); } } } ``` - **关键点**: - 使用`QDir::Files`过滤文件,`QDir::Dirs`保留文件夹以便递归。 - `entryInfoList()`获取文件信息列表。 - **优点**: 可灵活添加自定义逻辑(如过滤特定扩展名)。 --- ### 应用场景 1. **批量处理文件**: 如批量重命名、格式转换。 2. **文件搜索**: 实现类似资源管理器的搜索功能。 3. **数据统计**: 统计文件夹大小或文件数量。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值