遍历文件夹图片文件一、功能介绍: 在为数码相框所在文件系统实现U盘自动挂载之后,将U盘自动挂载在开发板上文件系统中的/mnt/usb目录,故还需为数码相框添加遍历/mnt/usb路径下的文件夹内图片文件,暂定为扫描指定目录下一层文件夹内的图片文件。 二、参考资料: 以下一段代码为使用QT实现遍历文件夹和文件目录(递归法) bool FindFile(const QString & path) 三、实现过程 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; 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_info(file_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;
//定义迭代器并设置过滤器 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);
更多关于获取文件图标、类型的详细信息请查看: · Qt之QFileIconProvider(获取文件图标、类型)。 · Qt之QFileIconProvider续(获取文件图标、类型)。
注: 技术在于交流、沟通,转载请注明出处并保持作品的完整性。 作者:╰☆奋斗ing?孩子` 原文:http://blog.sina.com.cn/s/blog_a6fb6cc90101f1ur.html。
|
|