Qt递归非递归遍历文件

qt最大的优势在于跨平台,虽然都说qt设计优良,文档丰富,但是qt一直不温不火的。不过跨平台确实可以节省不少人力物力,”一次编写,到处编译“,对于短期搭建框架也有优势.

#include <QDebug>
#include <QDir>
#include <QFile>
#include <QFileInfo>
#include <QFileInfoList>
#include <QQueue>
#include <QString>
#include <QStringList>
#include <QVector>

QVector<QString> all_files;

void DfsCollectFiles(const QString& filepath)    // not recommended for deep directory
{

    QFileInfo curFileInfo(filepath);
    if (!curFileInfo.isDir())
        return;
    QDir curDir(filepath);

    QFileInfoList curFileInfoList(curDir.entryInfoList());
    if (curFileInfoList.empty())
        return;

    QFileInfoList::const_iterator it;
    for (it = curFileInfoList.begin(); it != curFileInfoList.end(); ++it) {
        if (it->isDir() && it->fileName() != "."  && it->fileName() != "..") {
            DfsCollectFiles(it->absoluteFilePath());    //recursively
        } else if (!it->isDir()) {
            all_files.push_back(it->absoluteFilePath());
        }
    }

}

void BfsCollectFiles(const QString& filepath)     // bfs traverse
{
    QFileInfo cur_fileinfo(filepath);
    QQueue<QFileInfo> fileinfo_queue;    // queue
    QDir cur_dir(filepath);

    fileinfo_queue.enqueue(cur_fileinfo);
    while (!fileinfo_queue.isEmpty()) {
        cur_dir = fileinfo_queue.head().absoluteFilePath();
        fileinfo_queue.dequeue();
        QFileInfoList cur_fileinfolist = cur_dir.entryInfoList();

        QFileInfoList::const_iterator it;
        for (it = cur_fileinfolist.cbegin(); it != cur_fileinfolist.cend(); ++it) {
            if (it->isDir() && it->fileName() != "." && it->fileName() != "..") {    // jump "." and ".."
                fileinfo_queue.enqueue(it->absoluteFilePath());    // enqueue unresolved directories
            } else if (!it->isDir()){
                all_files.push_back(it->absoluteFilePath());
            }
        }
    }

}

测试代码:

int main()
{
    QString  filepath("/home/wnn/tmp");
    QVector<QString>::const_iterator it;

    DfsCollectFiles(filepath);
    qDebug() << all_files.size();
    for (it = all_files.cbegin(); it != all_files.cend(); ++it)
        qDebug() << *it;
    qDebug() << endl;

    all_files.clear();

    BfsCollectFiles(filepath);
    for (it = all_files.cbegin(); it != all_files.cend(); ++it)
            qDebug() << *it;
    qDebug() << all_files.size();

    return 0;
}

关于上面代码命名的约定,类名和函数名用驼峰命名法,类的成员函数和qt一样用“小驼峰命名法”, 非成员函数用“大驼峰命名法”,变量名统一用小写字母加下划线,这样从名称就可以判定一个成员是什么类别。遍历完所有文件就可以自行根据绝对路径处理了。

类似用shell列出文件:

ls -R | egrep "*.pdf"
#列出所有pdf文件

不过还是python简单粗暴:

import os

def cur_walk(curDir):
    for parent, dirnames, filenames in os.walk(curDir):
        for filename in filenames:    #files
            print os.path.abspath(os.path.join(parent, filename))
    for dirname in dirnames:    #directory
        print os.path.abspath(os.path.join(parent, dirname))

curDir = ‘/home/wnn/tmp‘
cur_walk(curDir)
http://ningning.today/2015/01/12/c++/Qt%E9%80%92%E5%BD%92%E9%9D%9E%E9%80%92%E5%BD%92%E9%81%8D%E5%8E%86%E6%96%87%E4%BB%B6/
时间: 2024-11-04 20:04:29

Qt递归非递归遍历文件的相关文章

二叉树总结—建树和4种遍历方式(递归&amp;&amp;非递归)

今天总结一下二叉树,要考离散了,求不挂!二叉树最重要的就是 建立.4种遍历方式,简单应用,如何判断两颗二叉树是否相似 二叉树分为 :1.完全二叉树  2.满二叉树 结构性质: 1).满二叉树 高度为h ,节点数则为 2^h - 1,且叶子节点全在最下层,且叶子节点数为2^(n-1)个{n代表二叉树层数,也叫深度} 2).n个节点的 完全二叉树 深度为 int(log2n)(以2为底n的对数)+ 1: 3).非空二叉树 叶子节点个数==双分支节点数+1 4).非空二叉树 某节点编号 n  若有左孩

快速排序递归非递归队列堆栈实现

递归实现 #include<iostream> using namespace std; template <class T> void QuickSort(T A[],int left,int right) { if(left<right) { int i=left; int j=right+1; do { do i++;while(A[i]<A[left]); do j--;while(A[j]>A[left]); if(i<j) Swap(A[i],A

【算法拾遗】二分查找递归非递归实现

转载请注明出处:http://blog.csdn.net/ns_code/article/details/33747953 本篇博文没太多要说的,二分查找很简单,也是常见常考的查找算法,以下是递归非递归的实现. 非递归实现: /* 非递归实现,返回对应的序号 */ int BinarySearch(int *arr,int len,int key) { if(arr==NULL || len<1) return -1; int low = 0; int high = len-1; while(l

二叉树基础(创建方法,遍历方法(前序/中序/后序/层序、递归/非递归)

二叉树的创建及遍历是很多二叉树问题的基础,递归遍历逻辑清晰,代码简约漂亮,然则效率低下(所有递归方案的通病,非不得已不用递归): 非递归遍历高效,却不是能信手写出来的,特别是后续非递归遍历,相信很多资深码工也有这样的经历: 5年前学习了二叉树的非递归遍历,一个月前复习了并达到能熟练写出的程度,在不参考任何资料的情况下,今天却怎样也写不出来. 如果你也有过这种经历,恭喜你,这说明你是一个正常人…… 另一方面市面上有些国人写的教材,各种语法.逻辑错误层出不起,不知祸害了多少未来的码工,深感痛心. 印

作业 树和森林 遍历(递归/非递归先序,递归/非递归后序,递归层次)

1 #include <iostream> 2 #include"queue.h"//之前写的类 3 #include"stack.h" //之前写的类 4 using namespace std; 5 6 template <class T> 7 class Tree; 8 9 //======================================== 10 // 树节点类声明 11 template <class T>

二叉树的前序/中序/后续遍历(递归+非递归)

这几日又把二叉树的递归写了一遍,原来是用C写的,自己写了一个栈,这一次直接用的C++,使用了自带的栈结构.代码如下: 1 /************************************************************************* 2 > Author: Yves 3 > E-mail: [email protected] 4 > File Name: BiTreeNew.cpp 5 > Description: ... 6 > Cre

2015-03-15---二叉树递归(非递归)实现先序、中序、后序遍历(附代码)

今天说好的不碰代码的,后来还是没忍住,学了学数据结构和算法,就先讲讲先序中序和后序遍历吧,我还写了代码,一套递归方式实现遍历二叉树,还有两套非递归方式遍历二叉树, 从简单的开始,因为二叉树的所有操作都是要求在能够遍历的基础上啊. 学过数据结构的肯定都明白遍历顺序, 先序遍历就是先自己,然后左子树,然后右子树, 中序遍历就是先左子树,然后自己,然后右子树 后序遍历就是先左子树,然后右子树,然后自己 比如上图这个很简单的二叉树: 先序遍历:1 2 4 5 3 6 7 中序遍历:4 2 5 1 6 3

二叉树,递归非递归遍历算法(全)

包含了所有的非递归和递归的算法: #include<iostream> #include<queue> #include<stack> using namespace std; //二叉树结点的描述 typedef struct BiTNode { char data; struct BiTNode *lchild, *rchild; //左右孩子 }BiTNode,*BiTree; //按先序遍历创建二叉树 //BiTree *CreateBiTree() //返回结

Java实现二叉树的创建、递归/非递归遍历

近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6.二叉树的递归后序遍历 7.二叉树的非递归后序遍历 8.二叉树的层次遍历 这里感谢博客http://blog.csdn.net/skylinesky/article/details/6611442的指导 /**二叉树的结点定义*/ class Node<T>{ private T value; pr

二叉树的先序、中序以及后序遍历(递归 &amp;&amp; 非递归)

树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二叉树: //递归建立二叉树 public static void BuildTree(TreeNode node, int data){ if(node == null){ node = new TreeNode(data); } if(data <= node.val){ if(node.left