黑马程序员技术交流社区

标题: 递归算法的一个小问题 [打印本页]

作者: 470620844    时间: 2016-8-11 11:34
标题: 递归算法的一个小问题
//需求:删除一个有内容的文件夹。
package day15;

import java.io.File;

public class DiGui {
        public static void main(String[] args) {
                shanChu("D:\\Eclipse\\day15\\新建文件夹");
        }

        public static void shanChu(String string) {
                // TODO Auto-generated method stub
                File file=new File(string);
                File[] files=file.listFiles();
               
                for (File file1:files) {
                       
                        if(file1.isDirectory()){
                                shanChu(file1.toString());
                                System.out.println(file1.getName()+"---"+file1.delete());
                        }
                        else{
                                System.out.println(file1.getName()+"---"+file1.delete());
                        }
                        System.out.println(file.getName()+"---"+file.delete());
                       
                }
               
               
        }

}
以上是自己写的代码,可以实现功能,可是过程不完美,控制台显示
3---true
2---false
3.txt---true
2---true
2---false
1---false
2.txt---true
1---true
1---false
新建文件夹---false
1.txt---true
新建文件夹---true
为什么会有false发生?哪里出了问题?
毕老师的代码没有false发生。这是为啥呢?
package cn.itcast.io.p1.file.test;

import java.io.File;


/*
* 删除一个带内容的目录。
*
* 原理:必须从最里面往外删。
* 需要进行深度遍历。
*
*
*
*/
public class RemoveDirTest {

        /**
         * @param args
         */
        public static void main(String[] args) {

                File dir  = new File("e:\\demodir");
//                dir.delete();
                removeDir(dir);
        }

        public static void removeDir(File dir) {
               
                File[] files = dir.listFiles();
               
                for(File file : files){
                       
                        if(file.isDirectory()){
                                removeDir(file);
                        }else{
                                System.out.println(file+":"+file.delete());
                        }
                }
                System.out.println(dir+":"+dir.delete());
        }
       

}


作者: paksung    时间: 2016-8-11 15:00
帮顶
作者: qetu001212    时间: 2016-8-11 20:47
      shanChu(file1.toString());                                                //tostring()建议换成getName()
      System.out.println(file1.getName()+"---"+file1.delete());    //请删除这句。。。
作者: 470620844    时间: 2016-8-11 22:34
qetu001212 发表于 2016-8-11 20:47
shanChu(file1.toString());                                                //tostring()建议换成 ...

你是说把
if(file1.isDirectory()){
shanChu(file1.toString());
System.out.println(file1.getName()+"---"+file1.delete());这条语句删了是吧?
试过,删除这句之后文件没了,文件夹都还在。

作者: 470620844    时间: 2016-8-11 22:40
qetu001212 发表于 2016-8-11 20:47
shanChu(file1.toString());                                                //tostring()建议换成 ...

shanChu(file1.toString());    //tostring()建议换成getName()
换成getName()的话,返回的不是绝对路径,而是文件夹或者文件名称,就会抛空指针异常,没办法继续递归了。
作者: life写实    时间: 2016-8-11 23:03
for (File file1:files) {
                        
                        if(file1.isDirectory()){
                                shanChu(file1.toString());
                                System.out.println(file1.getName()+"---"+file1.delete());//这句话不妥,判断是文件夹之后,再把它当做文件夹传进来递归即可,文件夹里可能还有文件和文件夹不能笼统的删除,也是删不掉的。
                        }
                        else{
                                System.out.println(file1.getName()+"---"+file1.delete());
                        }
                        System.out.println(file.getName()+"---"+file.delete());  //这一句要放在for外面,意思是删除文件夹里所有文件之后就可以删文件夹了。
                        
                }
作者: 470620844    时间: 2016-8-11 23:04
qetu001212 发表于 2016-8-11 20:47
shanChu(file1.toString());                                                //tostring()建议换成 ...

找到原因了,我把删除最外层文件夹语句写到for循环里头了,移出来之后再按你说的把第一条删除语句删掉就ok了。
作者: 470620844    时间: 2016-8-12 12:24
life写实 发表于 2016-8-11 23:03
for (File file1:files) {
                        
                        if(file1.isDirectory()){

确实是这样,厉害
作者: 安静的喝会奶    时间: 2016-8-12 13:55
if(file1.isDirectory()){
                                shanChu(file1.toString());
                                System.out.println(file1.getName()+"---"+file1.delete());
作者: 安静的喝会奶    时间: 2016-8-12 13:56
安静的喝会奶 发表于 2016-8-12 13:55
if(file1.isDirectory()){
                                shanChu(file1.toString());
                 ...

java删除是从底层开始删除的,不能直接删除一个非空的文件夹
作者: chensc    时间: 2016-8-13 06:16
学习学习!
作者: zztierlie    时间: 2016-8-13 10:04
赞一个,牛逼




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2