Java实现递归删除目录下超7天的过期文件及空文件夹
多级目录过期文件清理实现
原有代码仅遍历目标根目录下的一级文件,无法处理嵌套子目录,也不会清理内容被清空的空目录,可通过深度优先递归遍历的方式实现需求。
核心逻辑
- 优先处理目录最内层的文件和子目录,从底层往上层逐层判断删除
- 遇到文件直接校验最后修改时间,修改时间早于7天阈值的直接删除
- 遇到目录先递归处理其下所有子项,所有子项处理完成后,若目录内无剩余内容则删除该空目录
- 遇到文件占用、权限不足导致删除失败的场景,打印错误日志不中断整体清理流程
完整代码
import java.io.File; public class DirectoryCleaner { public static void main(String[] args) { String targetDir = "C:\\Project"; int expireDays = 7; File rootDir = new File(targetDir); // 计算过期时间阈值,加L转long避免整数运算溢出 long expireThreshold = System.currentTimeMillis() - (expireDays * 24 * 60 * 60 * 1000L); if (rootDir.exists() && rootDir.isDirectory()) { cleanExpiredContent(rootDir, expireThreshold); } } /** * 递归清理过期内容 * @param currentFile 当前处理的文件/目录 * @param expireThreshold 过期时间戳阈值 * @return 当前路径是否被成功删除 */ private static boolean cleanExpiredContent(File currentFile, long expireThreshold) { // 处理普通文件 if (currentFile.isFile()) { if (currentFile.lastModified() < expireThreshold) { boolean delResult = currentFile.delete(); if (!delResult) { System.err.println("文件删除失败: " + currentFile.getAbsolutePath()); } else { System.out.println("已删除过期文件: " + currentFile.getAbsolutePath()); } return delResult; } return false; } // 处理目录:先遍历处理所有子项 File[] childList = currentFile.listFiles(); if (childList != null) { for (File child : childList) { cleanExpiredContent(child, expireThreshold); } } // 子项处理完成后,判断目录是否为空,为空则删除 String[] remainItems = currentFile.list(); if (remainItems != null && remainItems.length == 0) { boolean delResult = currentFile.delete(); if (!delResult) { System.err.println("空目录删除失败: " + currentFile.getAbsolutePath()); } else { System.out.println("已删除空目录: " + currentFile.getAbsolutePath()); } return delResult; } return false; } }
注意事项
- 时间计算时将常量
1000写为1000L,将整数运算提升为long类型运算,避免多天毫秒值累加超过int取值上限导致的时间计算错误 - 目录删除判断放在子项全部处理完成之后,只要目录下还存在未过期的文件或未被删除的子目录,当前目录就不会被删除,完全匹配「子目录所有内容都过期清空后才删除目录本身」的要求
- 对
listFiles()和list()的返回值做了非空判断,避免目录无读取权限时触发空指针异常 - 递归逻辑默认支持任意层级的嵌套目录,不需要额外配置遍历深度
内容的提问来源于stack exchange,提问作者Nodir RaPuZ
相关产品推荐
相关产品推荐

