数码相框实现遍历文件夹图片文件

2023-11-04

遍历文件夹图片文件

一、功能介绍:

在为数码相框所在文件系统实现U盘自动挂载之后,将U盘自动挂载在开发板上文件系统中的/mnt/usb目录,故还需为数码相框添加遍历/mnt/usb路径下的文件夹内图片文件,暂定为扫描指定目录下一层文件夹内的图片文件。

二、参考资料:

以下一段代码为使用QT实现遍历文件夹和文件目录(递归法)

bool FindFile(const QString & path)
{
QDir dir(path);
if (!dir.exists())
return false;
dir.setFilter(QDir::Dirs|QDir::Files);
dir.setSorting(QDir::DirsFirst);
QFileInfoList list = dir.entryInfoList();
int i=0;
do{

QFileInfo fileInfo = list.at(i);
if(fileInfo.fileName()=="."|fileInfo.fileName()=="..")
{
i++;
continue;
}
bool bisDir=fileInfo.isDir();
if(bisDir)
{
nFiles++;
std::cout << qPrintable(QString("%1 %2%3").arg(fileInfo.size(), 10)
.arg(fileInfo.fileName(),10).arg(fileInfo.path()))<<endl;

FindFile(fileInfo.filePath());
}
else{
nFiles++;
std::cout << qPrintable(QString("%1 %2 %3").arg(fileInfo.size(),10)
.arg(fileInfo.fileName(),10).arg(fileInfo.path()))<<endl;
}
i++;
}while(i<list.size());
return true;
}

三、实现过程

1.主要使用以下qt类

Qdir——QDir则可以指定目录,以取得所指定目录或其中的项目信息(档案、目录等),可以设定名称过滤、属性过滤(像是只读、档案或是目录等等)与排序,过滤与排序可以使用setNameFilter()、setFilter()与setSorting()方法来设定,可以使用entryList()来取得一个目录下的所有档案与子目录字符串名称,或是使用entryInfoList()传回QFileInfoList,当中包括目录中所有项目的QFileInfo指针

QfileInfo—— QFileInfo就是用来取得指定的档案之相关讯息,像是相对或绝对路径信息、隐藏属性、大小、最后更新等,为了加快存取档案的信息,QFileInfo会快取信息,如果档案在快取信息之后,被使用者作了修正,则可以使用refresh()更新QFileInfo的信息。QFileInfo可以是符号链接(Symbol Link)、目录或档案,由isFile()、isDir()与isSymLink()来作判断。

2.实现代码:

//初始化参数

bool RenderArea::init()

{

    dirNum=0; //指定当前目录在指定目录下一层子目录的序号

    dirEndNum=0; //指定指定目录下一层子目录的数量

    bool reTurn=false;

    i_dirpic=0; //图片序号

   dir=tr("/mnt/usb");

    dirlist<<dir;

QDir picdir0(dir);

//判断文件夹是否为空

    if (!picdir0.exists())

    {

       qDebug("x1");

        dirNum=-1;

        return reTurn;

    }

   picdir0.setFilter(QDir::Dirs|QDir::NoDotAndDotDot);

QFileInfoList list0 = picdir0.entryInfoList();

//判断文件夹内文件夹数量是否为0

    if(list0.size()<1)

    {

       qDebug("x3");

        return reTurn;

    }

dirEndNum=list0.size();

//获取指定路径下一层文件夹路径列表

    for(intii=0;ii<list0.size();ii++)

    {

        QFileInfo fileInfo0 =list0.at(ii);

        QString  path=fileInfo0.filePath();

        dirlist<<path;

}

//递归遍历文件夹内图片文件

dirNum=picList(dirlist.at(dirNum));

    if(dirNum!=-1)

    {

        reTurn=true;

        emitgetDir(dirlist.at(dirNum), i_dirpic);

    }

   qDebug("dirNum=%d",dirNum);

    return reTurn;

}

 

//显示指定路径下第一张照片(遍历一层子目录)

int RenderArea::picList(QString nPicdir)

{

    QDir picdir(nPicdir);

    QStringList filters;

    filters <<"*.bmp" << "*.jpg" <<"*.png"<<"*.gif";

   picdir.setNameFilters(filters);

    QFileInfoList list =picdir.entryInfoList();

    if(list.size()<1&& dirNum<dirEndNum)

    {

       qDebug("return");

        dirNum++;

       if(dirNum==(dirEndNum+1))

        {

            dirNum=-1;

            return dirNum;

        }

       picList(dirlist.at(dirNum));

        return dirNum;

    }

    QFileInfo fileInfo =list.at(i_dirpic);

QString  path=fileInfo.filePath();

    return dirNum; //返回文件目录序号

}

 

 

 

 

 

Qt之遍历文件夹(经典详解)

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

    首先看简单的:

 

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

方式1

void ImageTree::addFolderImages(QStringpath)

{

    //判断路径是否存在

    QDir dir(path);

    if(!dir.exists())

    {

        return;

    }

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

    QFileInfoListlist = dir.entryInfoList();

 

    int file_count =list.count();

    if(file_count <=0)

    {

        return;

    }

 

    QStringList string_list;

    for(int i=0; i

    {

        QFileInfofile_info = list.at(i);

        QStringsuffix = file_info.suffix();

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

        {  

            QStringabsolute_file_path = file_info.absoluteFilePath();

            string_list.append(absolute_file_path);

        }

    }

}

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

 

方式2

void ImageTree::addFolderImages(QStringpath)

{

    //判断路径是否存在

    QDir dir(path);

    if(!dir.exists())

    {

        return;

    }

 

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

    }

    

    QStringListstring_list;

    //获取分隔符

    //QCharseparator = 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

    {

        QStringfile_name = dir[i];  //文件名称

        QStringfile_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_infofile_path)获取文件信息的对象

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

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

    

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

 

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

方式1

void ImageTree::addSubFolderImages(QStringpath)

{

    //判断路径是否存在

    QDir dir(path);

    if(!dir.exists())

    {

        return;

    }

 

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

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

 

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

    QDirIteratordir_iterator(path,

        filters,

        QDir::Files| QDir::NoSymLinks,

        QDirIterator::Subdirectories);

    QStringListstring_list;

    while(dir_iterator.hasNext())

    {

        dir_iterator.next();

        QFileInfofile_info = dir_iterator.fileInfo();

        QStringabsolute_file_path = file_info.absoluteFilePath();

        string_list.append(file_path);

    }

}

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

 

方式2

QStringList string_list;

voidImageTree::addSubFolderImages(QString path)

{

    QDir dir(path);

    if(!dir.exists())

    {

        return;

    }

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

    dir.setSorting(QDir::DirsFirst);

    QFileInfoListlist = dir.entryInfoList();

    int i = 0;

    bool is_dir;

    do

    {

        QFileInfofile_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

        {

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

            QStringsuffix =  file_info.suffix();

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

            {  

                QStringabsolute_file_path = file_info.absoluteFilePath();

                string_list.append(absolute_file_path);

            }

        }

        i++;

    }

    while(i

}

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

 

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

 

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

方法如下:

void setFile(const QString &file);

void setFile(const QFile &file);

void setFile(const QDir &dir, constQString &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 { returnreadLink(); }

 

QString owner() const;

uint ownerId() const;

QString group() const;

uint groupId() const;

 

bool permission(QFile::Permissionspermissions) const;

QFile::Permissions permissions() const;

 

qint64 size() const;

 

QDateTime created() const;

QDateTime lastModified() const;

QDateTime lastRead() const;

 

bool caching() const;

void setCaching(bool on);

 

更多关于获取文件图标、类型的详细信息请查看:

·        QtQFileIconProvider(获取文件图标、类型)

·        QtQFileIconProvider续(获取文件图标、类型)

 

注:

    技术在于交流、沟通,转载请注明出处并保持作品的完整性。

    作者:╰☆奋斗ing孩子`  原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101f1ur.html

 





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

数码相框实现遍历文件夹图片文件 的相关文章

  • Qt5调用QPixmap::fromWinHICON

    QPixmap QPixmap fromWinHICON HICON icon static Win32 only Returns a QPixmap that is equivalent to the given icon Warning
  • QT移植步骤

    1 在开发板的跟目录下新建两个目录 mkdir mini2440 mkdir tslib 2 拷贝相关的文件 2 1把PC机下面的 usr local Trolltech QtEmbedded 4 6 3 arm lib目录下面的所有文件全
  • QWidget的背景颜色和背景图片的设置

    首先设置autoFillBackground属性为真 然后定义一个QPalette对象 设置QPalette对象的背景属性 颜色或图片 最后设置QWidget对象的Palette 实例 QWidget widget new QWidget
  • [Qt]不带标题栏(FramelessWindowHint)的窗体移动及调整大小

    Qt窗体若设置了 setWindowFlags Qt FramelessWindowHint 运行后该窗体是无法进行移动和调整大小的 那要如何才能让它和普通窗体一样进行移动和调整其大小的呢 方案如下 void QFramelessWindo
  • 编译qt的pc版本X11出错:Basic XLib functionality test failed!

    Basic XLib functionality test failed You might need to modify the include and library search paths by editin 这个错误主要是因为 X
  • Qt动画效果展示

    在上一篇博文 Qt动画框架 原创翻译 中 我给大家原创翻译了Qt动画框架并且有文字和代码以及图片共同描述 今天在这篇博文中 主要实践Qt动画 做一个实例来讲解Qt动画使用 其界面如下图所示 由于没有录制为gif动画图片 所以请各位下载查看效
  • qt的QLabel中的字体越界

    今天使用文泉驿的中文库wqy zenhei ttc 发现QLabel中的汉字上面切顶了 但是如果一个QLabel和一个QLineEdit并排就不会出现这种现象 最后对QLabel使用样式解决了这个问题 MyLabel gt setStyle
  • Qt之QTextEdit

    关于QTextEdit Qt5对Qt4的做了一些小的改动 看上去很多方法都发生了变化 但万变不离其中 如 槽函数setFontFamily const QFont 变为setFontFamily const QString fontFami
  • setFocus不能生效的问题

    focusInEvent只有在对象显示出来的情况下设定setFocus才可以触发 这一点help手册里有说明 转一篇文章如下 http blog csdn net alex201030273437 article details 81937
  • linux 下安装编译配置 QT

    注 1 自己 make qt everywhere opensource src s时 在 configure前主动装好下面3个 sudo apt get install libX11 dev libXext dev libXtst dev
  • linux中编译tslib1.4出错:./autogen.sh: 4: autoreconf: not found

    autogen sh 4 autoreconf not found 是在不同版本的 tslib 下执行 autogen sh 产生 它们产生的原因一样 是 因为没有安装automake 工具 ubuntu 10 04 用下面的命令安装好就可
  • Tslib和Qt 4.8.4与在开发板上的移植

    这篇博客算是接着Linux 下编译 安装 配置 QT这篇的 搞完PC平台的就来弄一下嵌入式平台的 Linux的东西搞起来麻烦的地方就在于太杂 太散 像QT 各版本之间都有很多差异 因此在网络上查找资料不能光看某一个 必须很多资料综合来判断
  • Qt浅谈之二十二Qt样式表

    一 简介 不断总结好的样式表 美化自己的界面 在实际工作中会不断的更新 二 详解 1 加载样式表文件 html view plain copy QFile file qss stylesheet qss file open QFile Re
  • Qt中图像的显示与基本操作

    Qt可显示基本的图像类型 利用QImage QPxmap类可以实现图像的显示 并且利用类中的方法可以实现图像的基本操作 缩放 旋转 1 Qt可显示的图像类型 参考Qt的帮助文档 可支持的类型 即可以直接读取并显示的格式有BMP GIF JP
  • Qt3.6.3编译pc版本的时候:collect2:ld terminated with signal 11

    Qt3 6 3编译pc版本的时候 collect2 ld terminated with signal 11 原因 是swap交换空间不够用 解决 扩大虚拟内存 具体参考下文 http hi baidu com seaeechou blog
  • Qt Resize与布局的冲突?

    问题的产生 我用QSplitter创建一个窗口布局之后 由于使用窗口默认初始大小 显示出来的比例不是很好看 因此调用了resize进行窗口大小的调整 调整之后是获得了想要的窗口大小 但是与此同时 却发现了一个问题 也就是经过resize之后
  • 【转】QT中QWS的含义

    QT编程和文档中的术语QWS的全称是Qt windows system 是QT自行开发的窗口系统 体系结构类似X Windows 是一个C S结构 由QWS Server在物理设备上显示 由QWS Client实现界面 两者通过socket
  • Qt :非window子窗体的透明度设置

    问题的由来 心血来潮 想利用QTimer 配合 setWindowOpacity 方法来实现一个窗体淡入的效果 实验代码 粗糙的实验代码 void Widget on pushButton clicked QTimer timerOpaci
  • Qt技巧:QTextEdit显示网络图片

    Qt5的QNetworkAccessManager 类可以很方便的访问网络资源 QNetworkRequest类可以用于发送网络请求 而QNetworkReply则负责接收处理网络资源 今天遇到一个问题 如何在QTextEdit上显示一张网
  • QT学习之四:Linux 下 Qt Creator 的一个Qt 项目全过程

    Linux 下 Qt Creator 的一个Qt项目全过程 1 启动桌面上的 Qt Creator 新建工程 HelloWorld 点击 File gt New File orProject 如下图所示 2 新建类 Hello 右键单击项目

随机推荐

  • 985的分数,却毅然选择了普本

    这两天看到一个问题 如果分数只是擦边进985211院校 那是保住985211的学历还是选普通本科大学自己喜欢的专业读 今天来聊一下我的看法 首先针对这个问题说一下我的看法 能够进入985 就不要选择211 能够进入211就不要选择普通一本
  • VirtualBox安装出现严重错误

    H3C是我们学习很好用的软件 H3C虚拟平台的运行需要VirtualBox虚拟机之上 简单来说 要想使用H3C就必须要正确安装VirtualBox 如果有的小伙伴在卸载VirtualBox的时候 卸载方式不得当 导致VirtualBox残余
  • JNI调用native方法出现 java.lang.UnsatisfiedLinkError: XXXclass.XXXmethod()异常的解决办法

    JNI调用native方法出现 java lang UnsatisfiedLinkError XXXclass XXXmethod 异常的解决办法 参考文章 1 JNI调用native方法出现 java lang UnsatisfiedLi
  • Servlet——文件上传

    文件上传 文章目录 文件上传 1 Form表单形式实现 1 1 前端 1 2 后端 1 3 实现文件的上传然后保存到本地 2 Js Ajax实现 1 Form表单形式实现 1 1 前端 更改表单提交方式 form enctype multi
  • 功能测试在软件开发周期中的作用是什么?

    功能测试是软件开发周期中不可或缺的一个环节 其作用在于保证软件交付给用户之后满足用户需求和预期 在本文中 我们将详细解析软件开发周期中功能测试的作用 首先 功能测试是软件开发周期中质量保证的重要环节 在开发阶段 开发人员会编写代码 并使用不
  • 技术岗/算法岗面试如何准备?5000字长文、6个角度以2023秋招经历分享面试经验

    技术岗 算法岗面试流程是什么样的 技术面都干什么 Coding 机试如何准备 技术面考察哪些知识 如何准备 项目八股如何准备 简历要注意什么 怎么做 大家好 我是卷了又没卷 薛定谔的卷的大厂算法工程师 陈城南 本文会从以上6个问题 全方位
  • jdbc处理时间问题

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 遇到的问题如下 数据库中对应的字段属性为TIMESTAMP 6 java中类属性对应的字段为java util Date 虽然数据库中保存的是 2014 05 12 10
  • 一文带你精通Burp(附下载)

    添加链接描述 一文带你精通Burp 附下载
  • spring @EventListener 事件与监听

    1 自定义Application Event public class MyEvent extends ApplicationEvent private static final long serialVersionUID 1L priva
  • 1206. 设计跳表

    1206 设计跳表 不使用任何库函数 设计一个 跳表 跳表 是在 O log n 时间内完成增加 删除 搜索操作的数据结构 跳表相比于树堆与红黑树 其功能与性能相当 并且跳表的代码长度相较下更短 其设计思想与链表相似 例如 一个跳表包含 3
  • Dataset - DeepFashion 服装数据集

    Dataset DeepFashion 服装数据集 Dataset DeepFashion Project DeepFashion 对于数据集有学习科研等需求的 请在 AIUAI Dataset DeepFashion 服装数据集 中联系
  • 【最清晰】ThreadLocal和局部变量和成员变量的区别

    ThreadLocal是进程级别的全局变量 最近有一个疑惑 为什么线程类的局部变量不能完全替代ThreadLocal 每一次new 线程都是创建了一个副本啊照理来说也是独立的 为什么还需要ThreadLocal 实际上确实是独立的 但是答案
  • postman token 请求头添加

    思路 1 登录成功后将 得到的token设置为集合变量 2 在需要携带Authorization的请求头上使用该集合变量 关键代码 const responseData pm response json if responseData co
  • JsoupDemo123_Jsoup_三种解析方法(parse)

    文章目录 Jsoup 工具类 1 Jsoup快速入门 解析XML文件 2 parse String html 解析字符串的 3 解析URL parse URL url int timeoutMillis Jsoup 工具类 可以解析HTML
  • 数据结构(树的结构与定义)

    树的定义 树是由结点或顶点和边组成的 可能是非线性的 且不存在着任何环的一种数据结构 没有结点的树称为空 null或empty 树 一棵非空的树包括一个根结点 还 很可能 有多个附加结点 所有结点构成一个多级分层结构 二叉树的定义 每个结点
  • 一份DBA面试题及解答(zt)

    今天在浏览网页时 无意发现了这篇文章 觉得很好 一份DBA面试题及解答 zt 作者 xsb http xsb itpub net 发表于 2006 03 17 13 29 分类 Oracle 出处 http xsb itpub net po
  • dedecms添加搜索功能:

    1 在模板目录中新建模板文件 search htm 文件名是固定的 因为后台文件是根据这个文件名做判断的 2 在form表单中的action改为 dede global cfg cmsurl plus search php 把input中的
  • Java后端技术栈的应用

    作者 禅与计算机程序设计艺术 1 简介 在互联网企业中 Java技术占据了最重要的角色 原因很简单 Java已经成为主流开发语言 拥有众多优秀的第三方框架 工具和库 足以支撑企业在全球范围内的业务发展 由于Java具有跨平台特性 安全性高
  • Tracy IOS 小笔记 Xcode

    Xcode 是运行在操作系统 Mac OS X上的集成开发工具 IDE 新建项目 Hello world 添加用户界面元素 这些控件都在 对象库 中 就是有导航 一个 立方体icon 的按钮 查看控件属性是在 有导航的一个 向下夹头两边有两
  • 数码相框实现遍历文件夹图片文件

    遍历文件夹图片文件 一 功能介绍 在为数码相框所在文件系统实现U盘自动挂载之后 将U盘自动挂载在开发板上文件系统中的 mnt usb目录 故还需为数码相框添加遍历 mnt usb路径下的文件夹内图片文件 暂定为扫描指定目录下一层文件夹内的图