递归遍历详解

来源:互联网 发布:大公 知乎 编辑:程序博客网 时间:2024/06/08 12:39

本章内容,主要侧重于讲解一下递归遍历的思想,可能代码不全,需要大家自己完成。

1.SDcard文件资源的递归遍历为例子讲解思路。

首先要明白,SDcard递归遍历要用到一个文件File路径,几乎全部的路径,都是从根目录rootPath逐级获取到的。那么,rootPath显得尤为重要。

File rootPath=Environment.getExternalStorageDirectory()

注意,返回值本身就是File类型的,所以做ListView操作的时候,没有必要转换成String类型的,来显示文件列表。因为,ListView一般设置适配器SimpleAdapter,需要的5个参数(Contextlist<Map<String,X>data,int resource,String[] str,int to[])。所以,我们只需要做的工作就是构造出list数据源。

2.递归遍历,目的就是找出我们所需要的文件资源。

1)显示SDcard上各级文件夹和文件目录

第一次遍历,我们肯定是首先要根据rootPath路径,显示出根目录下的文件夹和文件列表。那我们做的工作就是,找出要显示的这个list列表,里面存储着文件夹和文件。那么我们怎么找呢?

实例代码:2-1

   File[] fs f.listFiles();

if (fs != null{

for (File file fs) {

Map<String, Object> map new HashMap<String, Object>();

if (file.isDirectory())

map.put("img"R.drawable.folder);

else {

map.put("img"R.drawable.notepad_32x32);

}

map.put("fname"file.getName());

lst.add(map);

}

}

return lst;

找出了数据源list,然后设置适配器,显示即可。


 

 第一次遍历完了,可以显示SDcard根目录下的第一级文件资源的列表了,那么下面我们怎么遍历下一级的文件资源目录呢?

这就是显示出了递归遍历的伟大之处~~~

思路

首先,listview添加点击事件。然后,进行判断,如果是目录,那么进行递归遍历;如果是文件,给出提示。

实例代码2-2

lv1.setOnItemClickListener(new OnItemClickListener() {

@Override

public void onItemClick(AdapterView<?> parent, View view,

int position, long id) {

File f_lst.get(position);

              //如果是目录,就再次执行代码2-1

if (f.isDirectory()) {

//此处执行代码2-1

else{

Toast.makeText(MyFileExplorerActivity.this"已是文件",

Toast.LENGTH_SHORT).show();

}

});

 如此类推,就完成了各级子目录的递归遍历。是否是非常简单呢?


2)用递归遍历的方法,删除指定的文件夹及子目录所有的文件。

要程序要删除SDcard上面的一个文件夹及其子目录的全部文件,大家首先要明白:你如果直接file.delete的话,是删不掉的。必须要先把子目录中的文件和文件夹删除掉,最后删除该文件夹。

实例代码2-3

private void deleteDirectorys(File file) {

2 if (file.isDirectory()) {

3 //先删除子文件夹和文件

4 File[] files=file.listFiles();

5 if(files!=null){

6 for (File ff:files) {

7 deleteDirectorys(ff);

8 }

9 }

10 }

11 //最后,删除该文件夹或文件

12     file.delete();

13 }

程序中,是传入了某个File对象,就是指定要删除的文件夹或者文件。重点是第67行。比如,指定一个目录:music-->mp3-->love.mp3/song.mp3 

执行过程:     true

                    4  files={mp3}

              ture

==1==   for{

                          执行  ===递归1==

      2  true

   files={love.mp3,song.mp3}

==2==   for{

    --love.mp3文件--

    执行  ===递归2==

   false

    12  删除love.mp3成功

        --song.mp3文件--

    执行  ===递归3==

   false

    12  删除song.mp3成功

      }

   12  删除mp3文件夹成功

   }

    12  删除music文件夹成功

从执行过程中,个人总结出某些规律:

     递归的次数+1=删除文件夹和文件的总和

   for{}循环执行的次数=该文件夹下有几级目录

2条规律刚看出来,不知道结论是否永远为true,大家可以再举几个例子再验证一下~~哈哈

3)用递归遍历的方法,显示某个文件夹及各级子目录下的全部文件。

既然要显示出全部的文件,那么只需要用递归遍历找出file.isFile()为真的File,然后添加到list中显示即可。可见具体代码:

实例代码:2-4

private List<Map<String, Object>> checkFile(File file){

File[] files=file.listFiles();

if (files!=null && files.length>0) {

for (File f:files) {

if (f.isDirectory()) {

checkFile(f);

}

else if (f.isFile()) {

  Map<String,Object> map=new HashMap<String, Object>();

  map.put("file_name",f.getName());

  list.add(map);

}

}

}

return list;

}

具体的执行推演过程,大家如果觉得脑子有点乱的话,建议找只笔推演下执行的过程,这样会比较容易理些。如有错误之处,还请大家在评论中给与指出~~Devil在此先谢过各位大虾。

原创粉丝点击