Qt中遍历文件夹的方法

2023-05-16

关于Qt操作文件夹、文件的知识用途较多,比如遍历下一层乃至所有子孙文件、文件夹,获取它们的一些信息(大小、类型、最后更改时间等)。当然,也可以进行级联删除。

    首先看简单的:

一、Qt遍历文件夹下一层的文件:

方式1:

void ImageTree::addFolderImages(QString path)

{

    //判断路径是否存在

    QDir dir(path);

    if(!dir.exists())

    {

        return;

    }

    dir.setFilter(QDir::Files | QDir::NoSymLinks);

    QFileInfoList list = dir.entryInfoList();

    int file_count = list.count();

    if(file_count <= 0)

    {

        return;

    }

    QStringList string_list;

    for(int i=0; i<file_count; i++)

    {

        QFileInfo file_info = list.at(i);

        QString suffix = file_info.suffix();

        if(QString::compare(suffix, QString("png"), Qt::CaseInsensitive) == 0)   

        {   

            QString absolute_file_path = file_info.absoluteFilePath();

            string_list.append(absolute_file_path);

        }

    }

}

     分析:遍历文件的下一层,对于系统而言包括:文件夹、文件、快捷方式,使用setFilter即可过滤。通过entryInfoList则可以获取过滤后所得到的文件夹下的文件信息列表,遍历文件通过操作QFileInfo可得到所需的文件详细信息(大小、类型、后缀等)。

方式2:

void ImageTree::addFolderImages(QString path)

{

    //判断路径是否存在

    QDir dir(path);

    if(!dir.exists())

    {

        return;

    }

    QStringList filters;
    filters<<QString("*.jpeg")<<QString("*.jpg")<<QString("*.png")<<QString("*.tiff")<<QString("*.gif")<<QString("*.bmp");

    dir.setFilter(QDir::Files | QDir::NoSymLinks); //设置类型过滤器,只为文件格式

    dir.setNameFilters(filters);  //设置文件名称过滤器,只为filters格式(后缀为.jpeg等图片格式)

    int dir_count = dir.count();

    if(dir_count <= 0)

    {

        return;

    }

    

    QStringList string_list;

    //获取分隔符

    //QChar separator = QDir::separator();

    QChar separator = QChar('/');

    if(!path.contains(separator))

    {

        separator = QChar('\');

    }

    QChar last_char = path.at(path.length()-1);

    if(last_char == separator)

    {

        separator = QChar();

    }

    

    for(uint i=0; i<dir_count; i++)

    {

        QString file_name = dir[i];  //文件名称

        QString file_path = path + separator + file_name;   //文件全路径

        string_list.append(file_path);

    }

    //string_list 添加完成之后,就可以查看list中的文件路径了

}

     分析:setNameFilters顾名思义,就是过滤文件名称的。如果只需要获取指定路径下的文件名,则可去掉“获取分隔符”部分代码(因为我是为了获取文件的全路径)。

    思考:QDir::separator()这是用于获取分隔符的,调试过程中发现path的分隔符为'/',奇怪的是获取到的为'\',刚好相反,所以我通过contains的方式获取分隔符的(无非'/'与'\')。

     讨论:如果设定filters后,那么存在一定的问题。熟用Windows的应该都知道,文件名是忽略大小写的(包括扩展名),那么若filters设定了“*.jpg”之后,则就不可添加扩展名为“.JPG”、“.Jpg”等大小写兼有的文件了。

    既然有问题,就有解决问题的方式。

    1、问题来源是由扩展名引起,那么去掉setNameFilters(filters);

    2、上述已经获取文件全路径,那么QFileInfo file_info(file_path)获取文件信息的对象

    3、通过file_info.suffix()或者completeSuffix()来判定文件的后缀、扩展名

    4、获取之后比较时忽略大小写即可。如:QString::compare(suffix, QString("*.jpeg"), Qt::CaseInsensitive) == 0

    

    总结:通过以上两种方式比较,关于遍历下一层的方式,采用“方式1”较好。

二、级联遍历文件夹及其子孙文件夹中的文件

方式1:

void ImageTree::addSubFolderImages(QString path)

{

    //判断路径是否存在

    QDir dir(path);

    if(!dir.exists())

    {

        return;

    }

    //获取所选文件类型过滤器

    QStringList filters;
    filters<<QString("*.jpeg")<<QString("*.jpg")<<QString("*.png")<<QString("*.tiff")<<QString("*.gif")<<QString("*.bmp");

    //定义迭代器并设置过滤器

    QDirIterator dir_iterator(path,

        filters,

        QDir::Files | QDir::NoSymLinks,

        QDirIterator::Subdirectories);

    QStringList string_list;

    while(dir_iterator.hasNext())

    {

        dir_iterator.next();

        QFileInfo file_info = dir_iterator.fileInfo();

        QString absolute_file_path = file_info.absoluteFilePath();

        string_list.append(file_path);

    }

}

     分析:QDirIterator定义过程中可设置过滤器,包括:文件名称、文件类型等。dir_iterator.next()这句话很重要,如果缺少将会进入死循环!

方式2:

QStringList string_list;

void ImageTree::addSubFolderImages(QString path)

{

    QDir dir(path);

    if(!dir.exists())

    {

        return;

    }

    dir.setFilter(QDir::Dirs | QDir::Files | QDir::NoSymLinks);

    dir.setSorting(QDir::DirsFirst);

    QFileInfoList list = dir.entryInfoList();

    int i = 0;

    bool is_dir;

    do

    {

        QFileInfo file_info = list.at(i);

        if(file_info.fileName() == "." | file_info.fileName() == "..")

        {

            i++;

            continue;

        }

        is_dir = file_info.isDir();

        if(is_dir)

        {

            //进行递归

            addSubFolderImages(file_info.filePath());

        }

        else

        {

            //获取文件后缀并获取所选包含类型,若存在包含类型且后缀相同,则添加

            QString suffix =  file_info.suffix();

            if(QString::compare(suffix, QString("png"), Qt::CaseInsensitive) == 0)   

            {   

                QString absolute_file_path = file_info.absoluteFilePath();

                string_list.append(absolute_file_path);

            }

        }

        i++;

    }

    while(i<list.size());

}

     分析:此方式采用递归的思路解决,也是网上大多数人用的办法,个人建议摒弃!递归的效率真心不敢接受,而且代码看起来也费劲。

    总结:通过以上两种方式比较,关于遍历子孙文件夹的方式,采用“方式1”较好。

关于QFileInfo获取文件信息的方法可以查看API

方法如下:

void setFile(const QString &file);

void setFile(const QFile &file);

void setFile(const QDir &dir, const QString &file);

bool exists() const;

void refresh();

QString filePath() const;

QString absoluteFilePath() const;

QString canonicalFilePath() const;

QString fileName() const;

QString baseName() const;

QString completeBaseName() const;

QString suffix() const;

QString bundleName() const;

QString completeSuffix() const;

QString path() const;

QString absolutePath() const;

QString canonicalPath() const;

QDir dir() const;

QDir absoluteDir() const;

bool isReadable() const;

bool isWritable() const;

bool isExecutable() const;

bool isHidden() const;

bool isNativePath() const;

bool isRelative() const;

inline bool isAbsolute() const { return !isRelative(); }

bool makeAbsolute();

bool isFile() const;

bool isDir() const;

bool isSymLink() const;

bool isRoot() const;

bool isBundle() const;

QString readLink() const;

inline QString symLinkTarget() const { return readLink(); }

QString owner() const;

uint ownerId() const;

QString group() const;

uint groupId() const;

bool permission(QFile::Permissions permissions) const;

QFile::Permissions permissions() const;

qint64 size() const;

QDateTime created() const;

QDateTime lastModified() const;

QDateTime lastRead() const;

bool caching() const;

void setCaching(bool on);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt中遍历文件夹的方法 的相关文章

随机推荐

  • c#中动态加载及显示UserControl和Form在父控件中

    1 UserControl的动态加载及显示与普通Control一致 如UserControl A 61 new UserControl parentControl Controls Add A 即可显示 2 Form的话需要show 或Vi
  • MFC中的模态对话框与非模态对话框的消息循环及消息传递问题(都可以通过SendMessage传递消息)

    注意 xff1a 非模态和模态对话框都有自己的消息响应过程函数WindowPro 只不过他们的调用模态是自己的消息泵 xff0c 非模态是由父窗体或父窗体的上一级的消息泵来调用 模态对话框和非模态对话框都可以通过SendMessage这个A
  • c#中子控件在父控件中显示的位置问题

    1 Control ShowDialog Control Parent 之前使Control StartPosition 61 FormStartPosition CenterScreen便可在父控件中居中于屏幕显示
  • 控件中的Cliked事件和MouseDown事件执行优先级问题

    MFC中 1 Button控件鼠标事件执行顺序 1 WM LBUTTONDOWN 2 WM LBUTTONUP 3 OnBnClickedButton1 2 Picture Control的鼠标事件执行顺序 1 WM LBUTTONDOWN
  • MFC中手动添加消息处理函数PreTranslateMessage截获按键等消息

    PreTranslateMessage作用和用法 PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的 xff0c 绝大多数本窗体的消息都要通过这里 xff0c 比較经常使用 xff0c 当须要
  • OpenStack核心组件

    OpenStack覆盖了网络 虚拟化 操作系统 服务器等各个方面 它是一个正在开发中的云计算平台项目 xff0c 根据成熟及重要程度的不同 xff0c 被分解成核心项目 孵化项目 xff0c 以及支持项目和相关项目 每个项目都有自己的委员会
  • mfc中钩子的使用

    钩子的安装与卸载 系统是通过调用位于钩子链表最开始处的钩子函数而进行消息拦截处理的 xff0c 因此在设置钩子时要把回调函数放置于钩子链表的链首 xff0c 操作系统会使其首先被调用 由函数SetWindowsHookEx 负责将回调函数放
  • mfc-钩子的使用方法详解

    钩子的安装与卸载 系统是通过调用位于钩子链表最开始处的钩子函数而进行消息拦截处理的 xff0c 因此在设置钩子时要把回调函数放置于钩子链表的链首 xff0c 操作系统会使其首先被调用 由函数SetWindowsHookEx 负责将回调函数放
  • mfc-钩子的使用方法详解

    钩子的安装与卸载 系统是通过调用位于钩子链表最开始处的钩子函数而进行消息拦截处理的 xff0c 因此在设置钩子时要把回调函数放置于钩子链表的链首 xff0c 操作系统会使其首先被调用 由函数SetWindowsHookEx 负责将回调函数放
  • c#中的消息处理函数和vc中的消息处理函数区别

    从vc入门编程的 xff0c 相信大家都很熟悉PreTranslateMessage和WindowProc两个函数 xff0c 前者是预处理windows发给控件的消息 xff0c 后者是处理剩余的控件消息 对于PreTranslateMe
  • c#中怎么截获按钮消息的几种方法实例验证

    public partial class Form2 Form public Form2 InitializeComponent this button1 MouseEnter 43 61 new EventHandler object o
  • QT中连接Mysql数据库及增删改查实例

    QT连接Mysql数据库步骤相对比较麻烦 xff0c 因此写了篇文章将详细过程呈现给大家 xff0c 欢迎大家来评论区指导提问 方法一 直接通过MySQL的驱动加载数据库 示例代码 xff1a xff08 1 xff09 在 pro文件中添
  • mysql 大批量数据优化插入数据速度

    在 MySQL 中 xff0c 向数据表插入数据时 xff0c 索引 唯一性检查 数据大小是影响插入速度的主要因素 本节将介绍优化插入数据速度的几种方法 根据不同情况 xff0c 可以分别进行优化 对于 MyISAM 引擎的表 xff0c
  • qt连接MySql数据库及增删改查示例

    include 34 mainwindow h 34 include 34 ui mainwindow h 34 include 34 QtSql QSqlDatabase 34 include 34 QMessageBox 34 incl
  • QT中拷贝一个项目的ui界面到另一个项目时Ui.h文件时Ui.h文件控件变量错乱问题解决

    qt中赋值另一个项目的ui时可能会产生在UI h的界面文件中控件变量确实或错乱 xff0c 这是可以去另一个项目的UI h文件中赋值全部代码拷贝到错乱的UI h中 xff0c 然后修改 一下 void setupUi QDialog Ins
  • C++中TCP socket传输文件

    在两个文件中都定义文件头和用到的宏 xff1a define MAX SIZE 10 define ONE PAGE 4096 struct FileHead char str 260 int size 在客户端发送接收阶段 xff1a 1
  • 使用Zeromq和protobuf实现的socket通信

    本文介绍使用ZeroMQ 下文简称ZMQ 结合protobuf序列化实现客户端和服务端的通信 在之前的一篇文章中 http blog csdn net cjf wei article details 52894560 介绍了Google的p
  • QT 中多线程实现方法总结

    第一 xff1a 用QtConcurrentRun类 xff0c 适合在另一个线程中运行一个函数 不用继承类 xff0c 很方便 第二 xff1a 用QRunnable和QThreadPool结合 继承QRunnable xff0c 重写r
  • c++TCP socket实时文件传输

    分为服务端和客户端 xff0c 实现文件的传输 好吧确实是有点本末倒置 xff0c 应该先上消息的互传 xff0c 再进行文件的传输 xff0c 这是因为在学习消息的传输时没有找到合适的讲得明白的教程 现在再回头看消息传输 xff0c 其实
  • Qt中遍历文件夹的方法

    关于Qt操作文件夹 文件的知识用途较多 xff0c 比如遍历下一层乃至所有子孙文件 文件夹 xff0c 获取它们的一些信息 xff08 大小 类型 最后更改时间等 xff09 当然 xff0c 也可以进行级联删除 首先看简单的 xff1a