本章内容,主要侧重于讲解一下递归遍历的思想,可能代码不全,需要大家自己完成。
1.以SDcard文件资源的递归遍历为例子讲解思路。
首先要明白,SDcard递归遍历要用到一个文件File路径,几乎全部的路径,都是从根目录rootPath逐级获取到的。那么,rootPath显得尤为重要。
File rootPath=Environment.getExternalStorageDirectory();
注意,返回值本身就是File类型的,所以做ListView操作的时候,没有必要转换成String类型的,来显示文件列表。因为,ListView一般设置适配器SimpleAdapter,需要的5个参数(Context,list<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 = 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 1 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对象,就是指定要删除的文件夹或者文件。重点是第6、7行。比如,指定一个目录:music-->mp3-->love.mp3/song.mp3 。
执行过程: 2 true
4 files={mp3}
5 ture
==1次== for{
执行1 ===递归1==
2 true
4 files={love.mp3,song.mp3}
==2次== for{
--love.mp3文件--
执行1 ===递归2==
2 false
12 删除love.mp3成功
--song.mp3文件--
执行1 ===递归3==
2 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在此先谢过各位大虾。