分享

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

 暗夜藏经阁 2016-04-27

遍历文件夹图片文件

一、功能介绍:

在为数码相框所在文件系统实现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

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多