Java中,为什么当File为目录时,file.isDirectory()会返回false

我建了一个删除文件的功能,以下是我写的代码;在路径指定的路径目录里面有文件还有目录,请问为什么输出的时候都是:“删除文件”

 import java.io.File;

public class Recursion2
{
    public File method(File f)
    {
        /*
         * 判断是否为文件目录
         */
        if (f.exists() == false)
        {
            System.out.println("路径文件不存在");
            return null;
        }

        /*
         * 删除文件目录
         */
        if (delete(f) == true)
        {
            return null;
        }
        else
        {
            File[] files = f.listFiles();
            for (File file : files)
            {
                method(file);
            }
            return method(f);
        }
    }

    private boolean delete(File file)
    {
        boolean jubge = file.delete();
        if (jubge)
        {
            if (file.isDirectory())
            {
                System.out.println("删除目录 " + file);
            }
            else
            {
                System.out.println("删除文件 " + file);
            }
        }
        return jubge;
    }

    public static void main(String[] args)
    {
        Recursion2 recursion = new Recursion2();
        File f = new File("D:/Desktop/火狐");
        recursion.method(f);
        System.exit(0);
    }
}

以下是文件路径:
图片说明

以下是部分输出结果:
删除文件 D:\Desktop\火狐\Mozilla Firefox\omni.ja
删除文件 D:\Desktop\火狐\Mozilla Firefox\pingsender.exe
删除文件 D:\Desktop\火狐\Mozilla Firefox\platform.ini
删除文件 D:\Desktop\火狐\Mozilla Firefox\plugin-container.exe
删除文件 D:\Desktop\火狐\Mozilla Firefox\plugin-container.exe.sig
删除文件 D:\Desktop\火狐\Mozilla Firefox\plugin-hang-ui.exe
删除文件 D:\Desktop\火狐\Mozilla Firefox\precomplete
删除文件 D:\Desktop\火狐\Mozilla Firefox\qipcap64.dll
删除文件 D:\Desktop\火狐\Mozilla Firefox\removed-files
删除文件 D:\Desktop\火狐\Mozilla Firefox\softokn3.chk
删除文件 D:\Desktop\火狐\Mozilla Firefox\softokn3.dll
删除文件 D:\Desktop\火狐\Mozilla Firefox\ucrtbase.dll
删除文件 D:\Desktop\火狐\Mozilla Firefox\uninstall\helper.exe
删除文件 D:\Desktop\火狐\Mozilla Firefox\uninstall\shortcuts_log.ini
删除文件 D:\Desktop\火狐\Mozilla Firefox\uninstall\uninstall.log
删除文件 D:\Desktop\火狐\Mozilla Firefox\uninstall\uninstall.update
删除文件 D:\Desktop\火狐\Mozilla Firefox\uninstall
删除文件 D:\Desktop\火狐\Mozilla Firefox\update-settings.ini
删除文件 D:\Desktop\火狐\Mozilla Firefox\updater.exe
删除文件 D:\Desktop\火狐\Mozilla Firefox\updater.ini
删除文件 D:\Desktop\火狐\Mozilla Firefox\vcruntime140.dll
删除文件 D:\Desktop\火狐\Mozilla Firefox\xul.dll
删除文件 D:\Desktop\火狐\Mozilla Firefox\xul.dll.sig
删除文件 D:\Desktop\火狐\Mozilla Firefox
删除文件 D:\Desktop\火狐

依据@caozhy的回答我把method改写成以下,结果还是一样啊?

    public void method(File f)
    {
        /*
         * 判断是否为文件目录
         */
        if (f.exists() == false)
        {
            System.out.println("路径文件不存在");
            return;
        }

        /*
         * 删除文件目录
         */
        if (f.isFile() || f.list().length == 0)
        {
            delete(f);
        }
        else
        {
            File[] files = f.listFiles();

            for (File file : files)
            {
                method(file);
                delete(file);
            }
            delete(f);
        }
    }
JavaKam
风之旅人、 用双参数构造器new File(a,b);
接近 2 年之前 回复

2个回答

file.delete()后对file产生了影响,你可以将delete方法修改成如下查看:
private boolean delete(File file)
{
boolean isDir = file.isDirectory();
boolean jubge = file.delete();
if (jubge)
{
System.out.println("删除前:"+isDir);
System.out.println("删除后:"+file.isDirectory());
if (isDir)
{
System.out.println("删除目录 " + file);
}
else
{
System.out.println("删除文件 " + file);
}
}
return jubge;
}


输出结果如下:
删除前:false
删除后:false
删除文件 /Users/deng/Pictures/test/.DS_Store
删除前:false
删除后:false
删除文件 /Users/deng/Pictures/test/568dcda4919fe.jpg
删除前:false
删除后:false
删除文件 /Users/deng/Pictures/test/test2/msc.jpeg
删除前:true
删除后:false
删除目录 /Users/deng/Pictures/test/test2
删除前:true
删除后:false
删除目录 /Users/deng/Pictures/test

wplsyc986
wplsyc986 可以将delete方法修一下就好了: private boolean delete(File file) { boolean isDir = file.isDirectory(); boolean jubge = file.delete(); if (jubge) { System.out.println("删除前:"+isDir); System.out.println("删除后:"+file.isDirectory()); if (isDir) { System.out.println("删除目录 " + file); } else { System.out.println("删除文件 " + file); } } return jubge; }
2 年多之前 回复
egg1996911
DengDengLei 回复TimeLapses: 嗯嗯不客气
2 年多之前 回复
TimeLapses
TimeLapses 还有我写错了个单词,不好意思,“judge”
2 年多之前 回复
TimeLapses
TimeLapses 谢谢答复!我明白了,原理我是在自己定义的delete方法里面先删除了目录,再判断,所以理所当然的为false了,再次谢谢指点
2 年多之前 回复

你的递归的时候,先删除后寻找子目录,然而对于目录来说,要先删除了子目录和子文件,才能删除目录本身。
所以你应该把遍历和删除两个代码颠倒下。
或者在
for (File file : files)
{
method(file);
}
下面再尝试删除下delete(f);

caozhy
贵阳老马马善福专业维修游泳池堵漏防水工程 回复TimeLapses: 上面那个delete(f);去掉啊
2 年多之前 回复
TimeLapses
TimeLapses 不行啊!我就算把method方法换成
2 年多之前 回复

file.delete()这个方法只能删除空文件夹,如果文件里面有文件夹就会返回false直接退出delete方法了,当file是文件的时候file.delete()为true才会执行delete后面的代码if (jubge){},所以file.isDirectory()肯定为false。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问