关于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);


    更多关于获取文件图标、类型的详细信息请查看:
http://blog.sina.com.cn/s/blog_a6fb6cc90101dx99.html

Qt之遍历文件夹(经典详解)的更多相关文章

  1. Qt之遍历文件夹

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

  2. Qt 【遍历文件夹文件,为listwidgetItem设置图标】

    效果图如上,通过qt本身的api去获取文件夹中文件的信息并且将其显示到listwidget上.只遍历当前文件夹的文件, 若文件夹中的子文件夹含有符合筛选器的文件那么并不会一同筛选出来 参考百度:htt ...

  3. Linux下文件和文件夹操作命令详解

    花了两个小时的时间,把文件和文件夹相关的常用命令:创建.删除.移动.复制.查找.重命名在linux上测试了一把,总结下来.文件夹的这些基本操作是要多注意的,一不小心就达不到你想要的效果. 文件夹操作: ...

  4. Linux文件夹权限详解

    - 第一个字符代表文件(-).目录(d),链接(l) - 其余字符每3个一组(rwx),读(r).写(w).执行(x) - 第一组rwx:文件所有者的权限是读.写和执行 - 第二组rw-:与文件所有者 ...

  5. linux根目录下文件夹概览详解

    / 根目录 /bin 存放必要的命令 /boot 存放内核以及启动所需的文件等 /dev 存放设备文件 /etc 存放系统的配置文件 /home 用户文件的主目录,用户数据存放在其主目录中 /lib ...

  6. C++框架_之Qt的信号和槽的详解

    C++_之Qt的信号和槽的详解 1.概述 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号(signal ...

  7. 个人永久性免费-Excel催化剂功能第83波-遍历文件夹内文件信息特别是图像、音视频等特有信息

    在过往的功能中,有体现出在Excel上管理文件的极大优势,在文件的信息元数据中,有图片和音视频这两类特有的属性数据,此篇对过往功能的一个补充,特别增加了图片和音视频信息的遍历功能. 使用场景 在文件管 ...

  8. Multipart/form-data POST文件上传详解

    Multipart/form-data POST文件上传详解 理论 简单的HTTP POST 大家通过HTTP向服务器发送POST请求提交数据,都是通过form表单提交的,代码如下: <form ...

  9. Linux "ls -l"文件列表权限详解

    ls Linux "ls -l"文件列表权限详解 1.使用 ls -l 命令 执行结果如下(/var/log) : drwxr-x--- root adm -- : apache2 ...

随机推荐

  1. WPF 保存文件

    private void button2_Click(object sender, RoutedEventArgs e) { var saveFileDialog1 = new SaveFileDia ...

  2. 【转】Eclipse工具使用技巧总结

    作者:Work Hard Work Smart 出处:http://www.cnblogs.com/linlf03/ 可参考http://www.codeceo.com/article/eclipse ...

  3. 11-18的学习总结(DOMSecondday)

    DOM:读取访问节点对象属性 批量删除父元素下所有子节点 elem.innerHTML=""; 批量替换父元素下所有子节点 elem.innerHTML="所有子元素标签 ...

  4. MYSQL 错误 :Out of resources when opening file './datagather/mx_domain#P#p178.MYD' (Errcode: 24) 解决办法

    出现Out of resources when opening file './xxx.MYD' (Errcode: 24)错误是因为打开的文件数超过了my.cnf的--open-files-limi ...

  5. Python正则表达式2

  6. C#让程序自动在管理员权限下运行

    windows 7和vista提高的系统的安全性,同时需要明确指定“以管理员身份运行”才可赋予被运行软件比较高级的权限,比如访问注册表等.否则,当以普通身份运行的程序需要访问较高级的系统资源时,将会抛 ...

  7. 学习Swift -- 构造器(中)

    构造器(中) 值类型的构造器代理 构造器可以通过调用其它构造器来完成实例的部分构造过程.这一过程称为构造器代理,它能减少多个构造器间的代码重复. 构造器代理的实现规则和形式在值类型和类类型中有所不同. ...

  8. 《深入剖析Tomcat》阅读(二)

    Tomcat是基于Sun公司标准的开源Servlet容器. Servlet是什么? Servlet(Server Applet),全称Java Servlet,未有中文译文.是用Java编写的服务器端 ...

  9. C51应用 Modbs Rtu协议实现与KEPServerEx 通信

    最近一客户要求使用STC12C5A60S2实现Modbus Rtu协议与KEPServerEx V4.0软件通信,采集单片机P2口每位的状态,设置P0口每位的状态,实现三路AD转换其中一路采集的是C0 ...

  10. Linux内核监控模块-1-驱动模块(LKM)开发(以一个简单的hello world程序为例)

    在上面一篇中介绍到,监控模块要做成一个驱动模块(或者说是可加载模块,LKM),动态的加载到Linux内核中.那么这篇就简单的介绍一下怎样做一个这样的驱动模块.   以简单的hello world程序为 ...