2 qq 33179811 qq_33179811 于 2016.03.17 16:45 提问

java递归删除目录的一个小问题

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DeleteFilesDemo {

public static void main(String[] args) throws FileNotFoundException {
    // TODO Auto-generated method stub
    File dir = new File("C:\\CODE\\a");
    deleteDir(dir);
    printTime();
}

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

public static void printTime() throws FileNotFoundException {
    String time = new SimpleDateFormat("yyyy-MM-dd  HH:mm:ss").format(new Date());
    new PrintStream("c:/code/deleteTime.log").print(time + "\r\n所有目录与文件删除成功!");
}

}

请问,如果递归到一个空目录,再调用一次deleteDir得到的File数组不就是空的了吗?那么遍历的时候为什么不会出现异常呢?

5个回答

gaoshouzhizui
gaoshouzhizui   2016.03.17 17:11
已采纳

这里假设是空目录A,判断是目录,递归调用deleteDir(File dir),然后到了 File[] files = dir.listFiles();这句,由于是空目录所以files=null;所以不进for循环的,就直接删除了。

gaoshouzhizui
gaoshouzhizui listFiles :public File[] listFiles()返回一个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 如果此抽象路径名不表示一个目录,那么此方法将返回 null。否则返回一个 File 对象数组。这是API里的原话。
2 年多之前 回复
enpterexpress
enpterexpress   Rxr 2016.03.17 16:53

先删除子目录,再删除此目录,怎么会遍历到空目录

qq_33179811
qq_33179811 假如到了if判断一个文件是不是目录的时候,不是要把这个目录里的文件放在File数组里吗?那如果这个目录是空的呢?File数组就不能遍历了啊
2 年多之前 回复
fubo1990
fubo1990   2016.03.17 16:59

不是你想的那样。
File[] files = dir.listFiles();
如果files为空及一个空目录,程序就进不了for循环,所有就调不到deleteDir(f)就不会出现你想的那种情况。所有不会抛异常。

fubo1990
fubo1990 for(int i=0;i<10;i++){}
2 年多之前 回复
fubo1990
fubo1990 回复qq_33179811:files 已经是空了进for循环前,就会判断的。
2 年多之前 回复
qq_33179811
qq_33179811 可为什么进不了for循环啊?
2 年多之前 回复
u013772876
u013772876   2016.03.17 17:10

foreach语句,空集不会迭代。

jpbirdy
jpbirdy   2016.03.17 20:44
 /**
     * Returns an array of abstract pathnames denoting the files in the
     * directory denoted by this abstract pathname.
     *
     * <p> If this abstract pathname does not denote a directory, then this
     * method returns {@code null}.  Otherwise an array of {@code File} objects
     * is returned, one for each file or directory in the directory.  Pathnames
     * denoting the directory itself and the directory's parent directory are
     * not included in the result.  Each resulting abstract pathname is
     * constructed from this abstract pathname using the {@link #File(File,
     * String) File(File,&nbsp;String)} constructor.  Therefore if this
     * pathname is absolute then each resulting pathname is absolute; if this
     * pathname is relative then each resulting pathname will be relative to
     * the same directory.
     *
     * <p> There is no guarantee that the name strings in the resulting array
     * will appear in any specific order; they are not, in particular,
     * guaranteed to appear in alphabetical order.
     *
     * <p> Note that the {@link java.nio.file.Files} class defines the {@link
     * java.nio.file.Files#newDirectoryStream(Path) newDirectoryStream} method
     * to open a directory and iterate over the names of the files in the
     * directory. This may use less resources when working with very large
     * directories.
     *
     * @return  An array of abstract pathnames denoting the files and
     *          directories in the directory denoted by this abstract pathname.
     *          The array will be empty if the directory is empty.  Returns
     *          {@code null} if this abstract pathname does not denote a
     *          directory, or if an I/O error occurs.
     *
     * @throws  SecurityException
     *          If a security manager exists and its {@link
     *          SecurityManager#checkRead(String)} method denies read access to
     *          the directory
     *
     * @since  1.2
     */
    public File[] listFiles() {
        String[] ss = list();
        if (ss == null) return null;
        int n = ss.length;
        File[] fs = new File[n];
        for (int i = 0; i < n; i++) {
            fs[i] = new File(ss[i], this);
        }
        return fs;
    }

return里写了,The array will be empty if the directory is empty.

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java递归删除目录及目录下的文件
我们知道File.delete()用于删除“某个文件或者空目录”!所以要删除某个目录及其中的所有文件和子目录,要进行递归删除,具体代码示例如下: /** * 递归删除目录下的所有文件及子目录下的所有文件 * * @param file 将要删除的文件目录 * @return 如果所有文件都删除成功则返回true, 有一个文件删除失败就停止删除并返
一个Java递归删除目录的方法
public static void delDir(File f) { 2 // 判断是否是一个目录, 不是的话跳过, 直接删除; 如果是一个目录, 先将其内容清空. 3 if(f.isDirectory()) { 4 // 获取子文件/目录 5 File[] subFiles = f.listFiles(); 6 // 遍...
递归地删除目录
写程序时用到一个删除目录的功能,但C库函数提供的_rmdir() 只能删除空目录,在网上搜索了一下也没得到满意的答案,于是就自己写了个小程序,递归地删除目录下的内容,最后删除目录本身。 主要用到了以下函数: _access(); /*判断目录是否存在*/ _chdir(); /*改变当前工作目录*/ _findfirst(); /*在目录下查找第一个文件或文件夹*/ _findnex
JavaIO之删除指定目录(递归删除,先删除目录下的文件再删除目录)
package 输出指定文件绝对路径; import java.io.File; /* * 需求:递归删除带内容的目录 * * 目录我已经给定:demo * * 分析: * A:封装目录 * B:获取该目录下的所有文件或者文件夹的File数组 * C:遍历该File数组,得到每一个File对象 * D:判断该File对象是否是文件夹 * 是:回到B * 否:就删除
Java递归删除目录文件
package com.jiepu.copy; import java.io.File; import java.util.ArrayList; import java.util.List; /** * Java递归删除目录文件 * @author Administrator * */ public class FileSystem { public static void main
JAVA递归删除目录失败
运维兄弟一不小心在服务器上创建了无限递归的目录,拜托我帮忙解决。 so easy,写了一个递归删除目录,但结果出乎意料,一个递归目录删除成功,而另外一个却删除失败,刚开始怀疑文件被占用问题,后来被排除了。后来尝试使用各种工具,文件粉碎机都不能解决。最后,通过重命名解决此问题。 file.delete()到底什么情况下会失败呢?这个是一个问题。
java用递归删除目录
今天学了一个递归很好的一个算法 目录删除前 package june; import java.io.File; /**  * 测试删除目录的类(用递归)  * @author overfront  *  */ public class FileTest { public static void main(String[] args) { File fil
Java递归删除目录
最近开了一门Java语言课,这是一个小作业,感觉挺有意思的。 利用Java.io包里的File类进行文件操作。 这里用到的函数陈列如下: public void File(String pathname)//File类构造函数 public String[] list()//获取当前目录下所有文件的文件名 public boolean delete(String pathname)//删
递归删除目录下所有文件
删除目录下所有文件,这个只能用递归方法进行!! 递归,只有遇到出口才会停止递归,出口逻辑一定要认真!!! 目录下可能有文件或文件夹,文件夹下面还有文件或文件夹,所以使用递归进行便利进行删除!! 直接上代码,解释很详细!!!短短几行代码直接实现,但是需要认真弄清楚里面的逻辑结构!!!import java.util.*; import java.io.File; public clas
python递归删除目录文件
def removeDir(dirPath): if not os.path.isdir(dirPath): return files = os.listdir(dirPath) try: for file in files: filePath=os.path.join(dirPath,file)