QT-用QDir非递归遍历子文件夹及其文件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了QT-用QDir非递归遍历子文件夹及其文件相关的知识,希望对你有一定的参考价值。

参考技术A 大多数的教程里采用递归遍历的方式,而这种方式对内存的开销很大,效率低,本篇文章用栈的知识来实现非递归遍历

源码:

QDir d("D:/viczsx/document/课程");        //此处修改遍历文件夹地址

d.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks | QDir::AllDirs);//列出文件,列出隐藏文件(在Unix下就是以.开始的为文件),不列出符号链接(不支持符号连接的操作系统会忽略)

d.setSorting(QDir::Size | QDir::Reversed);//按文件大小排序,相反的排序顺序

QFileInfoList list = d.entryInfoList();//返回这个目录中所有目录和文件的QFileInfo对象的列表

while(!list.isEmpty())

    QFileInfo tem= list.last();

    if(!tem.isDir())

        qDebug()<<  tem.fileName();

        list.removeLast();

    else if(tem.fileName() != "." && tem.fileName() != "..")

        qDebug()<< tem.filePath();

        QDir a(tem.filePath());

        list.removeLast();          //移除链表最后一项方便退回

        list.append(a.entryInfoList());

    else

        list.removeLast();

   



第一篇博客

使用java递归方法遍历指定目录下所有子目录和子文件

klException in thread "main" java.lang.NullPointerException at io9.FileList.tree(FileList.java:20) at io9.FileList.main(FileList.java:8)代码:package io9;import java.io.*; public class FileList public static void main(String[] args) File f = new File("d:/dzh2/gh/kl"); System.out.println(f.getName()); tree(f, 1); // 递归方法 private static void tree(File f, int level) String preStr = ""; for (int i = 0; i < level; i++) preStr += "-"; File[] childs = f.listFiles(); //listFiles()返回目录下的所有文件. for (int i = 0; i < childs.length; i++) System.out.println(preStr + childs[i].getName()); if (childs[i].isDirectory()) //isDirectory()判断是否为目录 tree(childs[i], level + 1);

参考技术A import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
* 读取目录及子目录下指定文件名的路径 并放到一个数组里面返回遍历
* @author zdz8207
*
*/
public class FileViewer
public static void main(String[] args)
//List arrayList = FileViewer.getListFiles("d:/com","html",true);

//读取d:/com下的以java 结尾的文件 如有子目录,包含之(后缀名为null则为所有文件)
//List arrayList = FileViewer.getListFiles("d:/com","java",true);

//经试验,后缀不能不填写,否则编译不通过,提示“FileViewer.java:17: 非法的表达式开始”。
//另外后缀为""时的情况需要 增加到IF 里去,否则 后缀为""时,不会显示所有文件
List arrayList = FileViewer.getListFiles("d:/com","",true);
if(arrayList.isEmpty())

System.out.println("没有符号要求的文件");

else

String message = "";
message += "符号要求的文件数:" + arrayList.size() + "\r\n";
System.out.println(message);

for (Iterator i = arrayList.iterator(); i.hasNext();)

String temp = (String) i.next();
System.out.println(temp);
message += temp + "\r\n";

//将显示的文件路径写到指定的文件里,若文件不存在,则提示IO异常
//java.io.FileNotFoundException: d:\ajax\menu.txt (系统找不到指定的路径。)
//如果 加个文件是否存在的判断,如不存在就在当前目录新建一个,则更好。
appendMethod("d:/menu.txt",message);


public static List<String> fileList = new ArrayList<String>();

/**
*
* @param path 文件路径
* @param suffix 后缀名
* @param isdepth 是否遍历子目录
* @return
*/
public static List getListFiles(String path, String suffix, boolean isdepth)

File file = new File(path);
return FileViewer.listFile(file ,suffix, isdepth);


public static List listFile(File f, String suffix, boolean isdepth)

//是目录,同时需要遍历子目录
if (f.isDirectory() && isdepth == true)

File[] t = f.listFiles();
for (int i = 0; i < t.length; i++)

listFile(t[i], suffix, isdepth);


else

String filePath = f.getAbsolutePath();

System.out.println("suffix = "+suffix);
if(suffix =="" || suffix == null)

//后缀名为null则为所有文件
System.out.println("----------------");
fileList.add(filePath);

else

int begIndex = filePath.lastIndexOf(".");//最后一个.(即后缀名前面的.)的索引
String tempsuffix = "";

if(begIndex != -1)//防止是文件但却没有后缀名结束的文件

tempsuffix = filePath.substring(begIndex + 1, filePath.length());


if(tempsuffix.equals(suffix))

fileList.add(filePath);

System.out.println("|||||||||||||||||||");




return fileList;


/**
* 方法追加文件:使用FileWriter
* @param fileName
* @param content
*/
public static void appendMethod(String fileName, String content)

try

//打开一个写文件器,构造函数中的第二个参数true表示以追加形式写文件
FileWriter writer = new FileWriter(fileName, true);
writer.write(content + "\r\n");
writer.close();

catch (IOException e)

e.printStackTrace();



本回答被提问者采纳
参考技术B 排版有个性了.. 参考技术C 注意一下排版再说吧 参考技术D 判断这个文件夹是否存在

以上是关于QT-用QDir非递归遍历子文件夹及其文件的主要内容,如果未能解决你的问题,请参考以下文章

快速排序(递归和非递归)及其优化

详解二叉树的遍历问题(前序后序中序层序遍历的递归算法及非递归算法及其详细图示)

树的非递归遍历——前序中序后序

递归和非递归遍历文件

数据结构——18 二叉树(非递归)

数据结构——18 二叉树(非递归)