自己手搓磁盘清理工具(JAVA版)

现在大部分磁盘瘦身工具都是收费的,帮你扫描完,你要去瘦身,就需要加会员,于是不如自己写个磁盘清理工具,安全起见这里只提供最简单的,需要扩展功能,自己按照这个思路去摸索,或者直接用AI写

java 复制代码
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.attribute.BasicFileAttributes;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * C盘瘦身工具类(增强版)
 * 安全清理:安装包残留、系统缓存残留,不影响系统运行
 */
public class CSlimmingEnhancedTool {
    // ========== 安全配置项(核心,请勿随意修改) ==========
    // 1. 安装包残留文件类型(仅清理这些格式)
    private static final Set<String> INSTALL_PACK_EXT = new HashSet<>(Arrays.asList(
            "exe", "msi", "zip", "rar", "7z", "gz", "tar", "iso", "pkg", "dmg", "bin"
    ));

    // 2. 系统缓存残留文件类型
    private static final Set<String> CACHE_EXT = new HashSet<>(Arrays.asList(
            "cache", "tmp", "temp", "log", "bak", "old", "dat", "ini", "sqlite", "db"
    ));

    // 3. 安全扫描目录(仅扫描这些目录,避开System32/Program Files等核心目录)
    private static final List<String> SAFE_SCAN_DIRS = new ArrayList<>(Arrays.asList(
            // 安装包常见目录
            System.getProperty("user.home") + "\\Downloads",          // 下载文件夹
            System.getProperty("user.home") + "\\Desktop",            // 桌面
            "C:\\Downloads",                                          // 公共下载目录
            // 缓存常见目录
            System.getenv("TEMP"),                                    // 用户临时目录
            "C:\\Windows\\Temp",                                      // 系统临时目录
            System.getProperty("user.home") + "\\AppData\\Local\\Temp",// 用户缓存
            System.getProperty("user.home") + "\\AppData\\Roaming\\Microsoft\\Windows\\Caches" // 系统缓存
    ));

    // 4. 黑名单目录(绝对禁止扫描/删除)
    private static final Set<String> BLACKLIST_DIRS = new HashSet<>(Arrays.asList(
            "C:\\Windows\\System32",
            "C:\\Windows\\SysWOW64",
            "C:\\Program Files",
            "C:\\Program Files (x86)",
            "C:\\Windows\\System",
            "C:\\Windows\\Boot"
    ));

    // ========== 日志配置 ==========
    private static final String LOG_FILE = System.getProperty("user.home") + "\\CSlimmingTool_Enhanced.log";
    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    /**
     * 分类扫描可清理文件
     * @return Map<类型, 文件列表>:key为"INSTALL_PACK"(安装包)/"CACHE"(缓存)
     */
    public Map<String, List<File>> scanCleanableFiles() {
        Map<String, List<File>> result = new HashMap<>();
        result.put("INSTALL_PACK", new ArrayList<>());
        result.put("CACHE", new ArrayList<>());

        log("开始扫描C盘可清理文件...");
        for (String dirPath : SAFE_SCAN_DIRS) {
            File dir = new File(dirPath);
            if (!dir.exists() || !dir.isDirectory()) {
                log("目录不存在或非文件夹,跳过:" + dirPath);
                continue;
            }
            // 递归扫描目录,分类收集文件
            scanDir(dir, result);
        }

        log("扫描完成 | 安装包残留:" + result.get("INSTALL_PACK").size() + "个 | 缓存残留:" + result.get("CACHE").size() + "个");
        return result;
    }

    /**
     * 递归扫描目录,分类收集可清理文件
     */
    private void scanDir(File dir, Map<String, List<File>> result) {
        // 跳过黑名单目录
        if (isBlacklistDir(dir)) {
            log("命中黑名单,跳过目录:" + dir.getAbsolutePath());
            return;
        }

        File[] files = dir.listFiles();
        if (files == null) return;

        for (File file : files) {
            // 递归处理子目录
            if (file.isDirectory()) {
                scanDir(file, result);
                continue;
            }

            // 校验文件:非系统保护、非空、可读写
            if (!isSafeFile(file)) {
                continue;
            }

            // 分类添加到对应列表
            String ext = getFileExtension(file).toLowerCase();
            if (INSTALL_PACK_EXT.contains(ext)) {
                result.get("INSTALL_PACK").add(file);
            } else if (CACHE_EXT.contains(ext)) {
                result.get("CACHE").add(file);
            }
        }
    }

    /**
     * 校验文件是否为安全可清理文件
     */
    private boolean isSafeFile(File file) {
        try {
            // 1. 跳过空文件(无清理意义)
            if (file.length() == 0) return false;
            // 2. 跳过系统保护文件(不可读/不可写)
            if (!file.canRead() || !file.canWrite()) return false;
            // 3. 跳过最近24小时修改的文件(避免误删刚下载/使用的文件)
            BasicFileAttributes attrs = Files.readAttributes(Paths.get(file.getAbsolutePath()), BasicFileAttributes.class);
            long lastModified = attrs.lastModifiedTime().toMillis();
            long now = System.currentTimeMillis();
            if (now - lastModified < 24 * 60 * 60 * 1000) {
                return false;
            }
            return true;
        } catch (Exception e) {
            log("文件校验失败:" + file.getAbsolutePath() + " | 原因:" + e.getMessage());
            return false;
        }
    }

    /**
     * 判断目录是否在黑名单中
     */
    private boolean isBlacklistDir(File dir) {
        String absPath = dir.getAbsolutePath().toLowerCase();
        for (String blackDir : BLACKLIST_DIRS) {
            if (absPath.startsWith(blackDir.toLowerCase())) {
                return true;
            }
        }
        return false;
    }

    /**
     * 获取文件扩展名(不含点)
     */
    private String getFileExtension(File file) {
        String fileName = file.getName();
        int lastDotIndex = fileName.lastIndexOf(".");
        if (lastDotIndex == -1 || lastDotIndex == fileName.length() - 1) {
            return "";
        }
        return fileName.substring(lastDotIndex + 1);
    }

    /**
     * 执行文件清理(用户确认后调用)
     * @param files 待清理文件列表
     * @return 清理成功的文件数量
     */
    public int cleanFiles(List<File> files) {
        int successCount = 0;
        log("开始清理文件 | 待清理数量:" + files.size());

        for (File file : files) {
            try {
                // 清理前再次校验(双重防护)
                if (!isSafeFile(file) || isBlacklistDir(file.getParentFile())) {
                    log("跳过非安全文件:" + file.getAbsolutePath());
                    continue;
                }

                // 安全删除文件(使用Files.delete更稳定)
                Path path = Paths.get(file.getAbsolutePath());
                Files.deleteIfExists(path);

                if (!file.exists()) { // 验证是否删除成功
                    successCount++;
                    log("清理成功:" + file.getAbsolutePath() + " | 大小:" + formatFileSize(file.length()));
                } else {
                    log("清理失败:文件仍存在 | " + file.getAbsolutePath());
                }
            } catch (Exception e) {
                log("清理异常:" + file.getAbsolutePath() + " | 原因:" + e.getMessage());
            }
        }

        log("清理完成 | 成功删除:" + successCount + "个 | 失败:" + (files.size() - successCount) + "个");
        return successCount;
    }

    /**
     * 格式化文件大小(字节转易读格式)
     */
    public String formatFileSize(long size) {
        if (size < 1024) return size + " B";
        else if (size < 1024 * 1024) return String.format("%.2f KB", size / 1024.0);
        else if (size < 1024 * 1024 * 1024) return String.format("%.2f MB", size / (1024.0 * 1024));
        else return String.format("%.2f GB", size / (1024.0 * 1024 * 1024));
    }

    /**
     * 计算文件列表总大小
     */
    public String calculateTotalSize(List<File> files) {
        long total = 0;
        for (File file : files) {
            total += file.length();
        }
        return formatFileSize(total);
    }

    /**
     * 记录操作日志
     */
    private void log(String content) {
        try (FileWriter writer = new FileWriter(LOG_FILE, true)) {
            String logContent = DATE_FORMAT.format(new Date()) + " - " + content + "\n";
            writer.write(logContent);
        } catch (IOException e) {
            System.err.println("日志写入失败:" + e.getMessage());
        }
    }

    // ========== 测试主方法(演示使用流程) ==========
    public static void main(String[] args) {
        CSlimmingEnhancedTool tool = new CSlimmingEnhancedTool();

        // 1. 扫描可清理文件
        Map<String, List<File>> cleanableFiles = tool.scanCleanableFiles();
        List<File> installPackFiles = cleanableFiles.get("INSTALL_PACK");
        List<File> cacheFiles = cleanableFiles.get("CACHE");

        // 2. 展示扫描结果
        System.out.println("===== 扫描结果 =====");
        System.out.println("安装包残留:" + installPackFiles.size() + "个 | 总大小:" + tool.calculateTotalSize(installPackFiles));
        System.out.println("缓存残留:" + cacheFiles.size() + "个 | 总大小:" + tool.calculateTotalSize(cacheFiles));

        // 3. 预览前5个安装包和前5个缓存文件
        System.out.println("\n===== 安装包残留预览(前5个) =====");
        for (int i = 0; i < Math.min(5, installPackFiles.size()); i++) {
            File file = installPackFiles.get(i);
            System.out.println((i+1) + ". " + file.getAbsolutePath() + " | 大小:" + tool.formatFileSize(file.length()));
        }

        System.out.println("\n===== 缓存残留预览(前5个) =====");
        for (int i = 0; i < Math.min(5, cacheFiles.size()); i++) {
            File file = cacheFiles.get(i);
            System.out.println((i+1) + ". " + file.getAbsolutePath() + " | 大小:" + tool.formatFileSize(file.length()));
        }

        // 4. 用户确认后清理
        Scanner scanner = new Scanner(System.in);
        System.out.print("\n是否确认清理以上文件?(Y/N):");
        String confirm = scanner.next();
        if ("Y".equalsIgnoreCase(confirm)) {
            // 合并所有可清理文件
            List<File> allFiles = new ArrayList<>();
            allFiles.addAll(installPackFiles);
            allFiles.addAll(cacheFiles);

            int success = tool.cleanFiles(allFiles);
            System.out.println("清理完成 | 成功删除:" + success + "个文件");
        } else {
            System.out.println("取消清理操作");
        }
        scanner.close();
    }
}

工具功能说明

  1. 安全清理原则

    • 只清理指定的安全目录,如临时文件夹、浏览器缓存等
    • 排除系统关键文件(.sys、.dll、.exe等)
    • 检查文件是否被锁定,避免删除正在使用的文件
    • 提供预览功能,让用户确认后再执行清理
  2. 清理范围

    • Windows临时目录(%TEMP%)
    • 用户临时目录(AppData\Local\Temp)
    • 浏览器缓存(Chrome、Firefox)
    • 系统临时目录(Windows\Temp、Windows\Prefetch)
  3. 使用方法

    • 运行程序后,会自动扫描可清理的文件
    • 显示扫描结果,包括文件数量和可释放空间
    • 用户确认后执行清理操作
    • 清理完成后显示成功删除的文件数和实际释放的空间
  4. 安全性保障

    • 只在预定义的安全目录中进行清理
    • 排除系统关键文件和正在使用的文件
    • 提供详细的清理日志,方便追踪操作
    • 采用保守策略,只删除确定安全的文件

扩展建议

  1. 添加GUI界面:可以使用Swing或JavaFX创建图形界面,提高用户体验
  2. 增加清理选项:允许用户选择要清理的目录和文件类型
  3. 添加备份功能:在删除文件前自动备份到指定位置
  4. 定期清理:添加定时任务功能,定期自动执行清理
  5. 跨平台支持:扩展支持Linux和MacOS系统

这个工具以安全为首要原则,通过严格的文件筛选机制,确保只删除无风险的临时文件和缓存,不会影响系统的正常运行。

相关推荐
J2虾虾1 小时前
在SpringBoot中使用Druid
java·spring boot·后端·druid
清风徐来QCQ2 小时前
Java笔试总结一
java·开发语言
lly2024062 小时前
《jEasyUI 转换 HTML 表格为数据网格》
开发语言
萧曵 丶2 小时前
LangChain Model IO 提示词模版(Python版)
开发语言·python·langchain
Elastic 中国社区官方博客2 小时前
Elastic 为什么捐赠其 OpenTelemetry PHP 发行版
大数据·开发语言·elasticsearch·搜索引擎·信息可视化·全文检索·php
10Eugene2 小时前
C++/Qt自制八股文
java·开发语言·c++
冰暮流星2 小时前
javascript如何实现删除数组里面的重复元素
开发语言·前端·javascript
程序员小假2 小时前
为什么要有 time _wait 状态,服务端这个状态过多是什么原因?
java·后端
yuweiade3 小时前
【Spring】Spring MVC案例
java·spring·mvc