package com.tongran.agent.client.utils; import java.io.IOException; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.attribute.BasicFileAttributes; import java.time.Instant; import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; public class FileCleaner { /** * 删除指定目录中 30 天前修改的文件 * * @param directoryPath 目录路径,例如:"/tmp/logs" * @param days 保留天数,传入 30 表示删除 30 天以上的文件 */ public static void cleanOldFiles(String directoryPath, int days) { Path dir = Paths.get(directoryPath); // 检查目录是否存在且是目录 if (!Files.exists(dir)) { System.err.println("目录不存在: " + directoryPath); return; } if (!Files.isDirectory(dir)) { System.err.println("路径不是目录: " + directoryPath); return; } // 计算 30 天前的时间点(Instant) Instant cutoffTime = Instant.now().minus(days, ChronoUnit.DAYS); List deletedFiles = new ArrayList<>(); List failedFiles = new ArrayList<>(); try (DirectoryStream stream = Files.newDirectoryStream(dir)) { for (Path file : stream) { // 只处理普通文件(跳过子目录等) if (Files.isRegularFile(file)) { try { BasicFileAttributes attrs = Files.readAttributes(file, BasicFileAttributes.class); Instant lastModifiedTime = attrs.lastModifiedTime().toInstant(); if (lastModifiedTime.isBefore(cutoffTime)) { Files.delete(file); // 删除文件 deletedFiles.add(file); System.out.println("已删除: " + file + " (修改时间: " + lastModifiedTime + ")"); } } catch (IOException e) { System.err.println("无法读取或删除文件: " + file + " -> " + e.getMessage()); failedFiles.add(file); } } } } catch (IOException e) { System.err.println("遍历目录失败: " + e.getMessage()); } // 统计结果 System.out.println("✅ 清理完成:"); System.out.println(" 删除文件数: " + deletedFiles.size()); System.out.println(" 删除失败数: " + failedFiles.size()); } // 使用示例 public static void main(String[] args) { // String logDir = "/tmp/logs"; // 替换为你的实际目录 // cleanOldFiles(logDir, 30); // 删除 30 天以上的文件 } }