Qt实现文件夹遍历

    科技2025-05-21  40

    文章目录

    1、Qt 实现对文件夹的遍历1)遍历一个文件夹 2、对一个文件夹的完全遍历


    1、Qt 实现对文件夹的遍历

    1)遍历一个文件夹

    1)是我们用 Qt 非常常用的功能,Qt 提供了非常好的接口,现在先写个简单的例子。

    1. 如何去遍历一个文件夹 2. 如何实现对文件的过滤 3. 如何实现对文件类型的过滤 4. 如何对文件路径排序输出

    QDir dir("C:/Users/st/Desktop"); //要判断路径是否存在 if(!dir.exists()) { qDebug() << "it is not true path"; return ; } dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);//实现对文件的过滤 dir.setSorting(QDir::Size | QDir::Reversed);//实现对文件输出的排序 QFileInfoList list = dir.entryInfoList(); QStringList string_list; for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QString suffix = fileInfo.suffix(); if(QString::compare(suffix,QString("ini"),Qt::CaseInsensitive) == 0)//通过QFileInfo来实现对文件类型的过滤 { QString absolute_file_path = fileInfo.absoluteFilePath(); string_list.append(absolute_file_path); } } int i= 0; for(QList<QString>::iterator iter = string_list.begin();iter != string_list.end();iter++)//用迭代器的输出 { qDebug() << string_list[i++]; }

    上面的例子解释了各种过滤的方法,详细的过滤方法查文档就好了。 QString::compare 是 C++ 里面的去百度一下就好了具体用法大体的用法就是: compare(“ab”,“ab”); //返回值为0; compare(“ab”,“df”); // 返回值<0; compare(“df”,"ab“); // 返回值>0; 第三个参数的是为了提高匹配的灵敏度 是个枚举类型去文档搜索下Qt::CaseSensitivity看下就行了

    2)我们还可以通过 QDir::setNameFilters (QStringList) 来过滤文件类型。

    QDir dir("C:/Users/st/Desktop"); //要判断路径是否存在 if(!dir.exists()) { qDebug() << "it is not true path"; return ; } QStringList filters; filters<<QString("*.jpeg")<<QString("*.txt")<<QString("*.lnk")<<QString("*.tiff")<<QString("*.gif")<<QString("*.bmp"); dir.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);//实现对文件的过滤 dir.setSorting(QDir::Size | QDir::Reversed);//实现对文件输出的排序 dir.setNameFilters(filters); //设置文件名称过滤器,只为filters格式(后缀为.jpeg等图片格式) QFileInfoList list = dir.entryInfoList(); QStringList string_list; for (int i = 0; i < list.size(); ++i) { QFileInfo fileInfo = list.at(i); QString absolute_file_path = fileInfo.absoluteFilePath(); string_list.append(absolute_file_path); } int i= 0; for(QList<QString>::iterator iter = string_list.begin();iter != string_list.end();iter++)//用迭代器的输出 { qDebug() << string_list[i++]; }

    个人建议是用第一种方法,因为在 windows 里面文件类型是不区分大小写的, 但是在 qt 里面是区别,第一种可以设置文件过滤的敏感性,来设置不区分大小写。

    2、对一个文件夹的完全遍历

    1)我们先用递归来理一下思路,但我们实际过程中能不用递归就不用递归,一方面对资源的消耗较大,另一方面考虑可能栈溢出的风险。

    QStringList MainWindow::getfiles(const QString &dir_path) { QStringList get_files; QDir dir(dir_path); if(!dir.exists()) { qDebug() << "it is not true dir_path"; } /*设置过滤参数,QDir::NoDotAndDotDot表示不会去遍历上层目录*/ QFileInfoList info_list = dir.entryInfoList(QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot); for(int i= 0 ; i< info_list.count(); i++) { QFileInfo info = info_list.at(i); if(info.isDir()) { /*找出下层目录的绝对路径*/ QString sub_dir = info.absoluteFilePath(); /*递归*/ QStringList get_next_files = getfiles(sub_dir); get_files.append(get_next_files); } else { QString file_name = info.absoluteFilePath(); get_files.append(file_name); } } return get_files; }

    谈一下递归的思路,递归的代码的可读性不强但是它的确思路最清晰 我们就是遍历一个文件夹,遇到文件夹跳进去遍历这个文件夹,遇到文件我们就把它的路径放到 QStringList 中。如果使用递归请尽量放在子线程里面防止卡死,和设置消息循环。

    2)下面我们使用迭代器来完全遍历一个文件夹:

    QStringList MainWindow::getfiles(const QString &dir_path) { QStringList get_files; QDir dir(dir_path); if(!dir.exists()) { qDebug() << "it is not true dir_path"; } /*设置过滤参数,QDir::NoDotAndDotDot表示不会去遍历上层目录*/ QDirIterator dir_iterator(dir_path,QDir::Files | QDir::Dirs | QDir::NoDotAndDotDot,QDirIterator::Subdirectories); while(dir_iterator.hasNext()) { dir_iterator.next(); QFileInfo file_info = dir_iterator.fileInfo(); QString files = file_info.absoluteFilePath(); get_files.append(files); } return get_files; }

    使用迭代器记得不要陷入死循环。建议使用迭代器,性能比递归高的多, 代码还精简了不少。

    转载自:https://blog.csdn.net/qq_39461448/article/details/83034810

    Processed: 0.012, SQL: 8