天天看点

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

文章目录

  • 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

继续阅读