原文地址 https://www.cnblogs.com/zhugaopeng/p/9416857.html

    一直在做 C++ 相关开发的工作。突然某一天一时兴起,想学习下 Java 开发。然后再网上找到一本 Java 简明教程,入门是够用了。看到文件 IO 这一章,想起之前用 C++ 做的删除文件或目录的练习,于是打算用 Java 来实现这个功能。本以为很简单的功能,还是遇到一些问题。仔细分析下代码,定位到出问题的地方。在此处记录下,提醒自己不会重蹈覆辙。

    1. 第一版的删除函数是这样写的
    1. 1 static boolean delFile(String filename) {
    2. 2 File file = new File(filename);
    3. 3 if (!file.exists()) {
    4. 4 return false;
    5. 5 }
    6. 6
    7. 7 if (file.isFile()) {
    8. 8 return file.delete();
    9. 9 } else {
    10. 10 String[] filenames = file.list();
    11. 11 for (String f : filenames) {
    12. 12 delFile(f);
    13. 13 }
    14. 14 return file.delete();
    15. 15 }
    16. 16 }

    代码能编译过,但是运行结果并不符合预期结果。如果在一个大型系统,出现这样的问题,往往是一件很头疼的小事。我的做法是,遇到自己不熟悉的,先自己建一个小工程实现这一功能,添加测试用例。如果测试通过,才会移植到大系统上去。

    经过仔细分析,上面的代码出问题的地方是第 10 行,file.list() 返回的结果是当前路径下的所有文件的文件名,并不包含路径。所以递归调用时,因为检测文件不存在,而返回。然后就有下面这一版。

    1. 正确的删除文件或目录方法
    1. 1 static boolean delFile(File file) {
    2. 2 if (!file.exists()) {
    3. 3 return false;
    4. 4 }
    5. 5
    6. 6 if (file.isFile()) {
    7. 7 return file.delete();
    8. 8 } else {
    9. 9 File[] files = file.listFiles();
    10. 10 for (File f : files) {
    11. 11 delFile(f);
    12. 12 }
    13. 13 return file.delete();
    14. 14 }
    15. 15 }

    这版的代码直接以文件对象 File 为参数,file.listFiles() 返回的也是自文件的 File 对象集合。File 对象保存了该文件的具体位置,因此不会出现上一版出现的问题,这一版能正常的工作。

    代码虽然能正常工作,但不是最简洁的版本。下面有一个更为简洁的版本。

    1. 简单并能正常工作的版本
    1. 1 static boolean delFile(File file) {
    2. 2 if (!file.exists()) {
    3. 3 return false;
    4. 4 }
    5. 5
    6. 6 if (file.isDirectory()) {
    7. 7 File[] files = file.listFiles();
    8. 8 for (File f : files) {
    9. 9 delFile(f);
    10. 10 }
    11. 11 }
    12. 12 return file.delete();
    13. 13 }

    同样可以正常工作,但是代码没有重复的。