鱼C论坛

 找回密码
 立即注册
查看: 147|回复: 3

[作品展示] [Windows] C盘清理工具(开源)

[复制链接]
发表于 6 天前 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
搬运来源:吾爱
发帖人:墨羽风


                               
登录/注册后可看大图


用rust编程写的  ai简单生成的 下面功能介绍和附带源代码
程序功能
1. 程序启动时会检查管理员权限
2. 要求用户输入密码(默认密码为 "52pojie"),输入时显示星号
3. 密码验证成功后,自动依次执行以下清理操作:
   - 清理临时文件
   - 清空回收站
   - 清理浏览器缓存
   - 清理 Windows 更新缓存
   - 清理 Windows 备份文件
   - 清理系统日志文件
   - 清理 Windows Defender 文件
   - 清理 IIS 日志
4. 每个清理操作完成后会暂停 1 秒,以便用户查看进度
5. 所有操作完成后,程序等待用户按回车键退出

工具下载链接:https://pan.baidu.com/s/15ej5aoAO6rH57_YujPVkXg?pwd=6666
下载链接2:https://pan.quark.cn/s/d9e047cbd7da

  1. use std::fs;
  2. use std::path::Path;
  3. use std::process::Command;
  4. use std::io::{self, Write};
  5. use std::env;
  6. use std::time::Duration;
  7. use std::thread;

  8. fn main() -> io::Result<()> {
  9.     println!("Windows 系统垃圾清理工具");
  10.     println!("========================");
  11.      
  12.     // 检查管理员权限
  13.     if !is_admin() {
  14.         println!("警告: 此程序需要管理员权限才能完全清理所有垃圾文件。");
  15.         println!("请右键点击程序,选择'以管理员身份运行'。");
  16.         pause()?;
  17.         return Ok(());
  18.     }

  19.     // 密码验证
  20.     if !verify_password()? {
  21.         println!("密码错误,程序退出。");
  22.         return Ok(());
  23.     }

  24.     println!("\n密码验证成功,开始执行清理操作...");
  25.      
  26.     // 依次执行所有清理功能
  27.     clean_temp_files()?;
  28.     empty_recycle_bin()?;
  29.     clean_browser_cache()?;
  30.     clean_windows_update_cache()?;
  31.     clean_windows_backup()?;
  32.     clean_log_files()?;
  33.     clean_defender_files()?;
  34.     clean_iis_logs()?;
  35.      
  36.     println!("\n所有清理操作已完成!");
  37.     pause()?;
  38.      
  39.     Ok(())
  40. }

  41. // 密码验证函数
  42. fn verify_password() -> io::Result<bool> {
  43.     const CORRECT_PASSWORD: &str = "52pojie"; // 设置正确的密码
  44.     let mut attempts = 3; // 允许尝试的次数
  45.      
  46.     while attempts > 0 {
  47.         print!("请输入密码 (还剩 {} 次尝试): ", attempts);
  48.         io::stdout().flush()?;
  49.          
  50.         // 使用PowerShell读取密码并显示星号
  51.         let password = read_password_with_powershell()?;
  52.          
  53.         if password == CORRECT_PASSWORD {
  54.             return Ok(true);
  55.         } else {
  56.             println!("\n密码错误!");
  57.             attempts -= 1;
  58.         }
  59.     }
  60.      
  61.     Ok(false)
  62. }

  63. // 使用PowerShell读取密码并显示星号
  64. fn read_password_with_powershell() -> io::Result<String> {
  65.     // 创建一个临时PowerShell脚本
  66.     let ps_script = r#"
  67.     $password = Read-Host -AsSecureString
  68.     $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($password)
  69.     $plainPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR)
  70.     Write-Output $plainPassword
  71.     "#;
  72.      
  73.     // 执行PowerShell脚本
  74.     let output = Command::new("powershell")
  75.         .args(&["-Command", ps_script])
  76.         .output()?;
  77.      
  78.     if output.status.success() {
  79.         // 转换输出为字符串并去除末尾的换行符
  80.         let password = String::from_utf8_lossy(&output.stdout)
  81.             .trim_end()
  82.             .to_string();
  83.          
  84.         Ok(password)
  85.     } else {
  86.         // 如果PowerShell命令失败,回退到标准输入
  87.         println!("\n无法使用安全输入模式,请直接输入密码:");
  88.         let mut password = String::new();
  89.         io::stdin().read_line(&mut password)?;
  90.         Ok(password.trim().to_string())
  91.     }
  92. }

  93. // 检查是否具有管理员权限
  94. fn is_admin() -> bool {
  95.     if let Ok(output) = Command::new("net")
  96.         .args(&["session"])
  97.         .output() {
  98.         output.status.success()
  99.     } else {
  100.         false
  101.     }
  102. }

  103. // 清理临时文件
  104. fn clean_temp_files() -> io::Result<()> {
  105.     println!("\n正在清理临时文件...");
  106.      
  107.     // 使用系统内置的磁盘清理工具
  108.     println!("使用系统磁盘清理工具清理临时文件...");
  109.     let _ = Command::new("cleanmgr")
  110.         .args(&["/sagerun:1"])
  111.         .status()?;
  112.      
  113.     // 清理系统临时文件夹
  114.     let temp_dirs = vec![
  115.         env::var("TEMP").unwrap_or_else(|_| String::from("C:\\Windows\\Temp")),
  116.         env::var("TMP").unwrap_or_else(|_| String::from("C:\\Windows\\Temp")),
  117.         String::from("C:\\Windows\\Temp"),
  118.     ];
  119.      
  120.     for dir in temp_dirs {
  121.         println!("清理目录: {}", dir);
  122.         let _ = Command::new("cmd")
  123.             .args(&["/c", &format!("del /f /s /q {}\\*", dir)])
  124.             .status()?;
  125.     }
  126.      
  127.     // 清理用户临时文件夹
  128.     if let Ok(userprofile) = env::var("USERPROFILE") {
  129.         let user_temp = format!("{}\\AppData\\Local\\Temp", userprofile);
  130.         println!("清理目录: {}", user_temp);
  131.         let _ = Command::new("cmd")
  132.             .args(&["/c", &format!("del /f /s /q {}\\*", user_temp)])
  133.             .status()?;
  134.     }
  135.      
  136.     // 清理预取文件
  137.     let prefetch_dir = "C:\\Windows\\Prefetch";
  138.     println!("清理预取文件: {}", prefetch_dir);
  139.     let _ = Command::new("cmd")
  140.         .args(&["/c", &format!("del /f /s /q {}\\*", prefetch_dir)])
  141.         .status()?;
  142.      
  143.     println!("临时文件清理完成!");
  144.     thread::sleep(Duration::from_secs(1));
  145.     Ok(())
  146. }

  147. // 清空回收站
  148. fn empty_recycle_bin() -> io::Result<()> {
  149.     println!("\n正在清空回收站...");
  150.      
  151.     // 使用系统内置的磁盘清理工具
  152.     println!("使用系统磁盘清理工具清理回收站...");
  153.     let _ = Command::new("cleanmgr")
  154.         .args(&["/sagerun:2"])
  155.         .status()?;
  156.      
  157.     // 使用PowerShell命令作为备选方案
  158.     let status = Command::new("powershell")
  159.         .args(&["-Command", "Clear-RecycleBin -Force -ErrorAction SilentlyContinue"])
  160.         .status()?;
  161.      
  162.     if status.success() {
  163.         println!("回收站已清空!");
  164.     } else {
  165.         println!("清空回收站时出错,可能需要管理员权限。");
  166.     }
  167.      
  168.     thread::sleep(Duration::from_secs(1));
  169.     Ok(())
  170. }

  171. // 清理浏览器缓存
  172. fn clean_browser_cache() -> io::Result<()> {
  173.     println!("\n正在清理浏览器缓存...");
  174.      
  175.     if let Ok(userprofile) = env::var("USERPROFILE") {
  176.         // Chrome 缓存
  177.         let chrome_cache = format!("{}\\AppData\\Local\\Google\\Chrome\\User Data\\Default\\Cache", userprofile);
  178.         if Path::new(&chrome_cache).exists() {
  179.             println!("清理 Chrome 缓存: {}", chrome_cache);
  180.             let _ = Command::new("cmd")
  181.                 .args(&["/c", &format!("del /f /s /q {}\\*", chrome_cache)])
  182.                 .status()?;
  183.         }
  184.          
  185.         // Edge 缓存
  186.         let edge_cache = format!("{}\\AppData\\Local\\Microsoft\\Edge\\User Data\\Default\\Cache", userprofile);
  187.         if Path::new(&edge_cache).exists() {
  188.             println!("清理 Edge 缓存: {}", edge_cache);
  189.             let _ = Command::new("cmd")
  190.                 .args(&["/c", &format!("del /f /s /q {}\\*", edge_cache)])
  191.                 .status()?;
  192.         }
  193.          
  194.         // Firefox 缓存
  195.         let firefox_cache = format!("{}\\AppData\\Local\\Mozilla\\Firefox\\Profiles", userprofile);
  196.         if Path::new(&firefox_cache).exists() {
  197.             println!("清理 Firefox 缓存: {}", firefox_cache);
  198.             
  199.             if let Ok(entries) = fs::read_dir(&firefox_cache) {
  200.                 for entry in entries.flatten() {
  201.                     if let Ok(metadata) = entry.metadata() {
  202.                         if metadata.is_dir() {
  203.                             let cache_dir = format!("{}\\cache2", entry.path().to_string_lossy());
  204.                             if Path::new(&cache_dir).exists() {
  205.                                 let _ = Command::new("cmd")
  206.                                     .args(&["/c", &format!("del /f /s /q {}\\*", cache_dir)])
  207.                                     .status()?;
  208.                             }
  209.                         }
  210.                     }
  211.                 }
  212.             }
  213.         }
  214.     }
  215.      
  216.     println!("浏览器缓存清理完成!");
  217.     thread::sleep(Duration::from_secs(1));
  218.     Ok(())
  219. }

  220. // 清理Windows更新缓存
  221. fn clean_windows_update_cache() -> io::Result<()> {
  222.     println!("\n正在清理Windows更新缓存...");
  223.      
  224.     // 使用系统内置的磁盘清理工具
  225.     println!("使用系统磁盘清理工具清理Windows更新文件...");
  226.     let _ = Command::new("cleanmgr")
  227.         .args(&["/sagerun:3"])
  228.         .status()?;
  229.      
  230.     // 清理Windows更新下载文件
  231.     println!("清理Windows更新下载文件...");
  232.     let _ = Command::new("net")
  233.         .args(&["stop", "wuauserv"])
  234.         .status()?;
  235.      
  236.     let _ = Command::new("cmd")
  237.         .args(&["/c", "del /f /s /q %windir%\\SoftwareDistribution\\Download\\*"])
  238.         .status()?;
  239.      
  240.     let _ = Command::new("net")
  241.         .args(&["start", "wuauserv"])
  242.         .status()?;
  243.      
  244.     // 清理Windows更新安装文件
  245.     println!("清理Windows更新安装文件...");
  246.     let _ = Command::new("dism")
  247.         .args(&["/online", "/cleanup-image", "/startcomponentcleanup", "/resetbase"])
  248.         .status()?;
  249.      
  250.     // 清理Windows更新备份文件
  251.     println!("清理Windows更新备份文件...");
  252.     let _ = Command::new("cleanmgr")
  253.         .args(&["/sagerun:8"])
  254.         .status()?;
  255.      
  256.     // 清理Windows更新日志
  257.     println!("清理Windows更新日志...");
  258.     let _ = Command::new("cleanmgr")
  259.         .args(&["/sagerun:9"])
  260.         .status()?;
  261.      
  262.     // 清理Windows更新临时文件
  263.     println!("清理Windows更新临时文件...");
  264.     let _ = Command::new("cleanmgr")
  265.         .args(&["/sagerun:10"])
  266.         .status()?;
  267.      
  268.     println!("Windows更新缓存清理完成!");
  269.     thread::sleep(Duration::from_secs(1));
  270.     Ok(())
  271. }

  272. // 清理Windows备份文件
  273. fn clean_windows_backup() -> io::Result<()> {
  274.     println!("\n正在清理Windows备份文件...");
  275.      
  276.     // 清理Windows.old文件夹(如果存在)
  277.     let windows_old = "C:\\Windows.old";
  278.     if Path::new(windows_old).exists() {
  279.         println!("发现 Windows.old 文件夹,尝试清理...");
  280.          
  281.         let status = Command::new("rmdir")
  282.             .args(&["/s", "/q", windows_old])
  283.             .status()?;
  284.          
  285.         if status.success() {
  286.             println!("Windows.old 文件夹已清理!");
  287.         } else {
  288.             println!("清理 Windows.old 文件夹失败,可能需要使用磁盘清理工具。");
  289.         }
  290.     }
  291.      
  292.     // 清理系统还原点
  293.     println!("清理系统还原点...");
  294.     let _ = Command::new("vssadmin")
  295.         .args(&["delete", "shadows", "/all", "/quiet"])
  296.         .status()?;
  297.      
  298.     println!("Windows备份文件清理完成!");
  299.     thread::sleep(Duration::from_secs(1));
  300.     Ok(())
  301. }

  302. // 清理系统日志文件
  303. fn clean_log_files() -> io::Result<()> {
  304.     println!("\n正在清理系统日志文件...");
  305.      
  306.     // 使用系统内置的磁盘清理工具
  307.     println!("使用系统磁盘清理工具清理系统日志...");
  308.     let _ = Command::new("cleanmgr")
  309.         .args(&["/sagerun:5"])
  310.         .status()?;
  311.      
  312.     // 清理Windows错误报告
  313.     println!("清理Windows错误报告...");
  314.     let _ = Command::new("cleanmgr")
  315.         .args(&["/sagerun:7"])
  316.         .status()?;
  317.      
  318.     // 清理事件日志
  319.     println!("清理事件日志...");
  320.     let _ = Command::new("powershell")
  321.         .args(&["-Command", "wevtutil el | Foreach-Object {wevtutil cl "$_"}"])
  322.         .status()?;
  323.      
  324.     // 清理CBS日志
  325.     let cbs_log = "C:\\Windows\\Logs\\CBS";
  326.     println!("清理 CBS 日志: {}", cbs_log);
  327.     let _ = Command::new("cmd")
  328.         .args(&["/c", &format!("del /f /s /q {}\\*", cbs_log)])
  329.         .status()?;
  330.      
  331.     println!("系统日志文件清理完成!");
  332.     thread::sleep(Duration::from_secs(1));
  333.     Ok(())
  334. }

  335. // 清理Windows Defender文件
  336. fn clean_defender_files() -> io::Result<()> {
  337.     println!("\n正在清理Windows Defender文件...");
  338.      
  339.     // 使用系统内置的磁盘清理工具
  340.     let _ = Command::new("cleanmgr")
  341.         .args(&["/sagerun:4"])
  342.         .status()?;
  343.      
  344.     println!("Windows Defender文件清理完成!");
  345.     thread::sleep(Duration::from_secs(1));
  346.     Ok(())
  347. }

  348. // 清理IIS日志
  349. fn clean_iis_logs() -> io::Result<()> {
  350.     println!("\n正在清理IIS日志...");
  351.      
  352.     // 使用系统内置的磁盘清理工具
  353.     let _ = Command::new("cleanmgr")
  354.         .args(&["/sagerun:6"])
  355.         .status()?;
  356.      
  357.     println!("IIS日志清理完成!");
  358.     thread::sleep(Duration::from_secs(1));
  359.     Ok(())
  360. }

  361. // 删除目录中的所有内容
  362. #[allow(dead_code)]
  363. fn delete_directory_contents(dir: &str) -> io::Result<()> {
  364.     if !Path::new(dir).exists() {
  365.         return Ok(());
  366.     }
  367.      
  368.     if let Ok(entries) = fs::read_dir(dir) {
  369.         for entry in entries.flatten() {
  370.             let path = entry.path();
  371.             
  372.             if let Ok(metadata) = entry.metadata() {
  373.                 if metadata.is_dir() {
  374.                     // 尝试递归删除子目录
  375.                     if let Err(e) = delete_directory_contents(&path.to_string_lossy()) {
  376.                         println!("  无法清理 {}: {}", path.display(), e);
  377.                     }
  378.                      
  379.                     // 尝试删除空目录
  380.                     if let Err(e) = fs::remove_dir(&path) {
  381.                         println!("  无法删除目录 {}: {}", path.display(), e);
  382.                     }
  383.                 } else {
  384.                     // 尝试删除文件
  385.                     if let Err(e) = fs::remove_file(&path) {
  386.                         println!("  无法删除文件 {}: {}", path.display(), e);
  387.                     }
  388.                 }
  389.             }
  390.         }
  391.     }
  392.      
  393.     Ok(())
  394. }

  395. // 暂停程序执行,等待用户按键
  396. fn pause() -> io::Result<()> {
  397.     print!("\n按回车键继续...");
  398.     io::stdout().flush()?;
  399.     let mut input = String::new();
  400.     io::stdin().read_line(&mut input)?;
  401.     Ok(())
  402. }
复制代码

评分

参与人数 1荣誉 +3 鱼币 +3 贡献 +3 收起 理由
小甲鱼的二师兄 + 3 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 6 天前 | 显示全部楼层
关于Rust编写的C盘清理工具代码分析

以下是对该工具代码的关键分析及使用建议:

  • 管理员权限检测:通过 net session 命令检测,建议改用Windows API方式更可靠
  • 密码安全问题:默认密码 52pojie 硬编码在代码中,建议自行修改
  • 清理可靠性问题:部分操作依赖 cleanmgr 工具,可能无法完全删除被占用的文件
  • 路径兼容性:代码中硬编码了C盘路径,可能不适用于系统安装在其他分区的用户


潜在风险提示
  • 清理回收站和系统日志属于高危操作,建议提前备份重要数据
  • 清理Windows.old文件夹会导致无法回滚系统版本
  • 浏览器缓存清理可能丢失网站登录状态等数据


改进建议

  1. // 更安全的管理员权限检测方法(需添加依赖)
  2. fn is_admin() -> bool {
  3.     unsafe { windows::Win32::Security::IsUserAnAdmin().as_bool() }
  4. }

  5. // 密码验证改进示例(使用哈希比对)
  6. const PASSWORD_HASH: &str = "5f4dcc3b5aa765d61d8327deb882cf99"; // md5("password")
  7. fn verify_password() -> bool {
  8.     // 计算输入密码的哈希值并与存储值比对
  9. }
复制代码


使用注意事项
1. 建议在虚拟机中测试后再实际使用
2. 修改默认密码后再编译使用
3. 谨慎清理Windows更新缓存,可能导致系统更新失败
4. 清理前建议手动创建系统还原点

下载链接有效性说明:当前分享链接来自第三方论坛,请自行扫描检测文件安全性后再使用。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
支持分享!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 5 天前 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-15 23:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表