我是靠谱客的博主 幸福柜子,最近开发中收集的这篇文章主要介绍Qt实现对文件夹的遍历,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

遍历一个文件夹

是我们用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看下就行了

我们还可以通过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里面是区别,第一种可以设置文件过滤的敏感性,来设置不区分大小写。

对一个文件夹的完全遍历

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

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中。如果使用递归请尽量放在子线程里面防止卡死,和设置消息循环。
下面我们使用迭代器来完全遍历一个文件夹:

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;
}

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

最后

以上就是幸福柜子为你收集整理的Qt实现对文件夹的遍历的全部内容,希望文章能够帮你解决Qt实现对文件夹的遍历所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部