Java I/O递归删除文件夹:为何未看到文件删除调用?
递归删除文件夹代码的文件删除逻辑解析
这段代码的核心逻辑藏在**File类的双重身份**里——它既能表示文件,也能表示文件夹,递归调用时会自动区分处理:
当传入的
directoryToBeDeleted是文件时:listFiles()方法会返回null,直接跳过循环执行最后一行的directoryToBeDeleted.delete(),这就是文件被删除的时机。
当传入的
directoryToBeDeleted是文件夹时:- 先通过
listFiles()获取内部所有文件和子文件夹,逐个递归调用deleteDirectory()。 - 等所有子内容(文件和子文件夹)都被递归清理完毕后,最后执行
directoryToBeDeleted.delete()删除空文件夹。
- 先通过
举个流程示例:
假设要删除/test文件夹,内部包含file1.txt和子文件夹subdir(其中有file2.txt):
- 首次调用
deleteDirectory(/test),获取到file1.txt和subdir - 递归调用
deleteDirectory(file1.txt):因是文件,listFiles()返回null,直接执行delete()删除该文件 - 递归调用
deleteDirectory(subdir):获取到file2.txt- 再次递归调用
deleteDirectory(file2.txt):直接删除该文件 - 此时
subdir已为空,执行delete()删除这个空文件夹
- 再次递归调用
- 最后
/test文件夹为空,执行delete()完成删除
原代码对照:
boolean deleteDirectory(File directoryToBeDeleted) { File[] allContents = directoryToBeDeleted.listFiles(); if (allContents != null) { for (File file : allContents) { deleteDirectory(file); } } return directoryToBeDeleted.delete(); }
内容的提问来源于stack exchange,提问作者questionsneedanswers
相关产品推荐
相关产品推荐

