黑马程序员技术交流社区

标题: 文件删除的一个问题 一个if else问题 [打印本页]

作者: 刘凯    时间: 2013-2-22 11:45
标题: 文件删除的一个问题 一个if else问题
本帖最后由 刘凯 于 2013-2-22 16:20 编辑
  1. import java.io.*;

  2. class DeleteClass
  3. {
  4. public static void main(String[] args)
  5. {
  6. File dir = new File("E:\\java0216");
  7. int count = 0;
  8. count = delete(dir,count);
  9. System.out.println("共删除"+count+"个文件");
  10. }
  11. public static int delete(File dir,int count)
  12. {
  13. File[] files = dir.listFiles();

  14. if(files!=null)
  15. {
  16. System.out.println(files.length);
  17. for(File file : files)
  18. {
  19. if(file.isAbsolute())
  20. count = delete(file.getAbsoluteFile(),count);

  21. else // 这里为什么我用else就不能执行下边大括号的代码 ,而这里换为  if(file.isFile())   就可以执行
  22. {
  23. System.out.println(file.getName());
  24. if(file.getName().endsWith(".class")||file.getName().endsWith(".bak"))
  25. {
  26. System.out.println("删除 ..."+file.getName());
  27. file.delete();
  28. count++;
  29. }
  30. }
  31. }
  32. }
  33. return count;

  34. }
  35. }
复制代码
写了个小程序 想删除E:\java0216文件夹下所有.class和.java.bak文件
如上编代码注释处,用if(file.isFile())来判断就可以执行括号中的代码   换做else就执行不到 括号中的代码。 也就是说 这里else下的代码执行不到
求大神指教 为什么?

作者: 罗海云    时间: 2013-2-22 13:47
import java.io.*;

class DeleteClass
{
public static void main(String[] args)
{
File dir = new File("E:\\java0216");
int count = 0;
count = delete(dir,count);
System.out.println("共删除"+count+"个文件");
}
public static int delete(File dir,int count)
{
File[] files = dir.listFiles();

if(files!=null)
{
System.out.println(files.length);
for(File file : files)
{
if(file.isAbsolute())
count = delete(file.getAbsoluteFile(),count);

if(file.isFile())
// else // 这里为什么我用else就不能执行大括号的代码 ,而换为if(file.isFile()) 就可以执行
{//如果你这儿加else的话. 就有可能出现这种情况. for循环结束之前if判断都成功,在用else就不会执行到, 假如用if的话, 每次都要判断./其余的就不解释了
System.out.println(file.getName());
if(file.getName().endsWith(".class")||file.getName().endsWith(".bak"))
{
System.out.println("删除 ..."+file.getName());
file.delete();
count++;
}
}
}
}
return count;

}
}
作者: 黑马刘杰    时间: 2013-2-22 13:47
  1. if (files != null) {
  2.                         System.out.println(files.length);
  3.                         for (File file : files) {
  4.                                 if (file.isAbsolute()){
  5.                                         //这里执行了,下面else就不执行了
  6.                                         count = delete(file.getAbsoluteFile(), count);
  7.                                 }
  8.                                 //如果是else的话,这里就不执行了
  9.                                 if (file.isFile())
  10.                                 // else // 这里为什么我用else就不能执行大括号的代码 ,而换为if(file.isFile()) 就可以执行
  11.                                 {
  12.                                         System.out.println(file.getName());
  13.                                         if (file.getName().endsWith(".class")
  14.                                                         || file.getName().endsWith(".bak")) {
  15.                                                 System.out.println("删除 ..." + file.getName());
  16.                                                 file.delete();
  17.                                                 count++;
  18.                                         }
  19.                                 }
  20.                         }
  21.                 }
复制代码

作者: 刘凯    时间: 2013-2-22 14:14
黑马刘杰 发表于 2013-2-22 13:47

我当然知道上边if成立 下边的else就不执行了  问题是 为什么上边的if不成立 下边的else还是不执行???
作者: 刘凯    时间: 2013-2-22 14:19
罗海云 发表于 2013-2-22 13:47
import java.io.*;

class DeleteClass

好吧 ,我重新写一下我的问题
  1. import java.io.*;

  2. class DeleteClass
  3. {
  4. public static void main(String[] args)
  5. {
  6. File dir = new File("E:\\java0216");
  7. int count = 0;
  8. count = delete(dir,count);
  9. System.out.println("共删除"+count+"个文件");
  10. }
  11. public static int delete(File dir,int count)
  12. {
  13. File[] files = dir.listFiles();

  14. if(files!=null)
  15. {
  16. System.out.println(files.length);
  17. for(File file : files)
  18. {
  19. if(file.isAbsolute())
  20. count = delete(file.getAbsoluteFile(),count);

  21. else // 这里为什么我用else就不能执行下边大括号的代码 ,而这里换为 if(file.isFile()) ; 就可以执行
  22. {
  23. System.out.println(file.getName());
  24. if(file.getName().endsWith(".class")||file.getName().endsWith(".bak"))
  25. {
  26. System.out.println("删除 ..."+file.getName());
  27. file.delete();
  28. count++;
  29. }
  30. }
  31. }
  32. }
  33. return count;

  34. }
  35. }
复制代码

作者: 胡发友    时间: 2013-2-22 15:52
import java.io.*;

class DeleteClass
{
        public static void main(String[] args)
        {
                File dir = new File("E:\\java0216");
                int count = 0;
                count = delete(dir,count);
                System.out.println("共删除"+count+"个文件");
        }
        public static int delete(File dir,int count)
        {
                File[] files = dir.listFiles();

                if(files!=null)
                {
                        System.out.println(files.length);
                        for(File file : files)
                        {
                                /*
                                if(file.isAbsolute())
                                count = delete(file.getAbsoluteFile(),count);
                                */
                               
                                /*
                               
                                1、if语句中用的isAbsolute()方法是判断此路径名是不是一个绝对路径名:
                                        例:d:\abc\a.txt 则,返回 true
                               
                                2、if语句中用的getAbsoluteFile()方法返回此绝对路径名的绝对路径名
                                        例:d:\abc\a.txt
                               
                                3、else语句中用的getName()方法是返回的文件的名字;例:a.txt
                               
                                4、if...else语句是用于判断,一个事物或对象是A事物还是B事物,或者是A对象还是B对象;
                                        注意,虽然判断的要么是A事物或者是B事物,但都是事物;
                               
                                5、这就可以看出,一个绝对路径名和一个文件名,就不是同一个事物,
                                        如:d:\abc\a.txt和a.txt。一个是文件,一个是路径,他们是同一个事物吗?
                                        肯定不是;
                               
                                6、通过以上分析,我把if语句中的isAbsolute()方法换成了isDirectory(),把getAbsoluteFile()方法去掉;
                                        这样就保证了目录和文件是同一个事物;
                                       
                                        再实际运行,运行OK;

                                以上为个人浅见,如果哪里分析的不对,还望指出,谢谢
                               
                               
                               
                                */
                                /*此为我修改后的代码*/
                                if( file.isDirectory() ){
                                        count = delete( file , count );
                                }

                                else // 这里为什么我用else就不能执行下边大括号的代码 ,而这里换为 if(file.isFile()) ; 就可以执行
                                {
                                        System.out.println(file.getName());
                                        if(file.getName().endsWith(".class")||file.getName().endsWith(".bak"))
                                        {
                                                System.out.println("删除 ..."+file.getName());
                                                file.delete();
                                                count++;
                                        }
                                }
                        }
                }
                return count;

        }
}
作者: 刘凯    时间: 2013-2-22 16:19
ykglove 发表于 2013-2-22 14:55
楼主你delete方法里传送的时绝对路径,在listFiles里得到的路径都是绝对的路径,if(file.isAbsolute())一直 ...

。。。。 2了突然 想写isDirctory()的、、
作者: 刘凯    时间: 2013-2-22 16:20
黑马刘杰 发表于 2013-2-22 13:47

。。。。 2了突然 想写isDirctory()的、、
作者: 刘凯    时间: 2013-2-22 16:23
胡发友 发表于 2013-2-22 15:52
import java.io.*;

class DeleteClass

已经知道哪错了。。。。 2了突然 想写isDirctory()的、、   写成isAbsolute()了  。  
作者: 孙娜    时间: 2013-2-22 18:25
刘凯 发表于 2013-2-22 14:14
我当然知道上边if成立 下边的else就不执行了  问题是 为什么上边的if不成立 下边的else还是不执行??? ...

上面的if成立,下面的else是可以执行的。把上面if里面的条件直接写成false,就可以进入else。你写的if里面的条件一直是true,所以才不执行else的。
作者: 刘凯    时间: 2013-2-22 19:14
孙娜 发表于 2013-2-22 18:25
上面的if成立,下面的else是可以执行的。把上面if里面的条件直接写成false,就可以进入else。你写的if里 ...

姐姐 我知道这个  我只是吧方法写错了、、




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