自己手搓磁盘清理工具(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系统

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

相关推荐
她说..1 天前
Java 对象相关高频面试题
java·开发语言·spring·java-ee
watson_pillow1 天前
c++ 协程的初步理解
开发语言·c++
庞轩px1 天前
深入理解 sleep() 与 wait():从基础到监视器队列
java·开发语言·线程··wait·sleep·监视器
故事和你911 天前
洛谷-算法1-2-排序2
开发语言·数据结构·c++·算法·动态规划·图论
皮皮林5511 天前
面试官:ZSet 的底层实现是什么?
java
码云数智-大飞1 天前
C++ RAII机制:资源管理的“自动化”哲学
java·服务器·php
2601_949816581 天前
Spring+Quartz实现定时任务的配置方法
java
白毛大侠1 天前
理解 Go 接口:eface 与 iface 的区别及动态性解析
开发语言·网络·golang
李昊哲小课1 天前
Python办公自动化教程 - 第7章 综合实战案例 - 企业销售管理系统
开发语言·python·数据分析·excel·数据可视化·openpyxl
Hou'1 天前
从0到1的C语言传奇之路
c语言·开发语言