You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.06 16:15:43