返回顶部
分享到

使用Python实现Windows系统垃圾清理

python 来源:互联网 作者:佚名 发布时间:2025-05-29 20:41:55 人浏览
摘要

一、开发背景与工具概述 1.1 为什么需要专业清理工具 在日常使用Windows系统时,我们经常会遇到: 系统盘空间莫名减少 电脑运行速度越来越慢 浏览器缓存堆积影响上网体验 系统更新残留文件

一、开发背景与工具概述

1.1 为什么需要专业清理工具

在日常使用Windows系统时,我们经常会遇到:

  • 系统盘空间莫名减少
  • 电脑运行速度越来越慢
  • 浏览器缓存堆积影响上网体验
  • 系统更新残留文件占用大量空间

Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件。市面上第三方清理工具又往往捆绑广告,甚至存在隐私风险。

1.2 工具设计理念

本工具基于Python+PyQt5开发,具有以下特点:

  • 纯净无捆绑 - 不收集任何用户数据
  • 深度清理 - 覆盖12类系统垃圾
  • 智能安全 - 危险操作多重确认
  • 开源透明 - 代码完全可审计

二、工具核心功能解析

2.1 八大核心清理模块

功能模块 清理内容 技术实现
临时文件清理 系统/用户临时文件、预取缓存 cleanmgr+直接删除
回收站清空 所有分区回收站文件 PowerShell命令
浏览器缓存 Chrome/Edge/Firefox缓存 定位AppData路径
更新残留 Windows更新下载文件、组件存储 DISM命令
系统备份 Windows.old文件夹、还原点 VSSAdmin命令
日志文件 事件日志、错误报告 Wevtutil工具
休眠文件 hiberfil.sys休眠文件 Powercfg命令
虚拟内存 pagefile.sys分页文件 WMI命令

2.2 特色功能亮点

智能权限检测:自动识别管理员权限,提示关键功能限制

操作日志记录:详细记录每次清理操作(见cleanup_log.txt)

渐进式进度显示:实时反映清理进度

危险操作防护:删除重要文件前需二次确认

三、实际效果展示

3.1 清理前后对比测试

测试环境:Windows 11 22H2,系统盘已使用128GB

清理项目 释放空间 耗时
临时文件 3.2GB 2分18秒
更新缓存 6.7GB 3分42秒
系统日志 1.1GB 45秒
全盘清理 11.3GB 8分15秒

3.2 特色界面展示

使用说明&指南

危险操作确认

四、使用教程(图文详解)

4.1 环境准备

安装Python 3.8+

安装依赖库:

1

pip install pyqt5 pywin32 ctypes

4.2 操作步骤

启动工具

1

python CleanupTool.py

推荐使用流程

高级用户模式

  • 可单独点击各功能按钮
  • 查看日志文件了解详细清理情况

五、关键技术实现解析

5.1 核心代码架构

1

2

3

4

5

6

7

8

9

10

class CleanupTool(QMainWindow):

    def __init__(self):

        # 初始化UI、权限检测、日志系统

        pass

     

    def run_command(self, command, description):

        # 统一命令执行入口

        pass

     

    # 各清理功能模块...

5.1.1 功能模块架构图

5.2 关键技术点

管理员权限检测

1

ctypes.windll.shell32.IsUserAnAdmin()

浏览器缓存路径定位

1

os.path.join(os.environ['USERPROFILE'], 'AppData', 'Local')

安全删除实现

1

subprocess.run(f'del /f /s /q "{path}"', shell=True)

日志记录系统

1

2

with open("cleanup_log.txt", "a") as f:

     f.write(f"[{timestamp}] {action}\n")

六、完整源码下载

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

242

243

244

245

246

247

248

249

250

251

252

253

254

255

256

257

258

259

260

261

262

263

264

265

266

267

268

269

270

271

272

273

274

275

276

277

278

279

280

281

282

283

284

285

286

287

288

289

290

291

292

293

294

295

296

297

298

299

300

301

302

303

304

305

306

307

308

309

310

311

312

313

314

315

316

317

318

319

320

321

322

323

324

325

326

327

328

329

330

331

332

333

334

335

336

337

338

339

340

341

342

343

344

345

346

347

348

349

350

351

352

353

354

355

356

357

358

359

360

361

362

363

364

365

366

367

368

369

370

371

372

373

374

375

376

377

378

379

import os

import subprocess

import sys

import time

import ctypes

from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton,

                             QVBoxLayout, QWidget, QLabel, QMessageBox,

                             QProgressBar)

from PyQt5.QtCore import Qt

 

class CleanupTool(QMainWindow):

    def __init__(self):

        super().__init__()

        self.setWindowTitle(" Windows系统清理工具")

        self.setGeometry(100, 100, 650, 550)  # 调整窗口大小适应新内容

        self.is_admin = self.check_admin()

        self.cleaned_items = 0  # 清理项计数器

        self.init_ui()

         

    def init_ui(self):

        main_widget = QWidget()

        layout = QVBoxLayout()

         

        # 标题

        title = QLabel("????? Windows 系统深度清理工具 ????")

        title.setStyleSheet("font-size: 22px; font-weight: bold; color: #2c3e50;")

        title.setAlignment(Qt.AlignCenter)

        layout.addWidget(title)

         

        # 权限状态

        admin_status = QLabel()

        if self.is_admin:

            admin_status.setText("? 管理员权限已获取 (可执行完整清理)")

            admin_status.setStyleSheet("color: #27ae60; font-weight: bold;")

        else:

            admin_status.setText("?? 警告: 部分功能需要管理员权限")

            admin_status.setStyleSheet("color: #e74c3c; font-weight: bold;")

        admin_status.setAlignment(Qt.AlignCenter)

        layout.addWidget(admin_status)

         

        # 进度条

        self.progress = QProgressBar()

        self.progress.setAlignment(Qt.AlignCenter)

        layout.addWidget(self.progress)

         

        # 功能按钮

        buttons = [

            ("???? 清理临时文件 (推荐)", self.clean_temp_files),

            ("????? 强制清空回收站", self.empty_recycle_bin),

            ("???? 清除浏览器缓存 (Chrome/Edge/Firefox)", self.clean_browser_cache),

            ("???? 深度清理Windows更新残留", self.clean_windows_update_cache),

            ("???? 删除系统旧版本备份 (Windows.old)", self.clean_windows_backup),

            ("???? 清除系统日志和错误报告", self.clean_log_files),

            ("????? 清理Defender防病毒垃圾", self.clean_defender_files),

            ("???? 清理IIS网站日志 (服务器专用)", self.clean_iis_logs),

            ("???? 删除休眠文件 (hiberfil.sys)", self.clean_hibernation_files),

            ("???? 重置虚拟内存 (需重启生效)", self.clean_pagefile),

            ("???? 一键智能全盘清理 (推荐)", self.clean_all)

        ]

         

        for text, func in buttons:

            btn = QPushButton(text)

            btn.setStyleSheet("""

                QPushButton {

                    font-size: 14px;

                    padding: 8px;

                    margin: 2px;

                    background-color: #3498db;

                    color: white;

                    border-radius: 5px;

                }

                QPushButton:hover {

                    background-color: #2980b9;

                }

            """)

            btn.clicked.connect(func)

            layout.addWidget(btn)

         

        # 帮助按钮

        help_btn = QPushButton("?? 使用说明")

        help_btn.setStyleSheet("background-color: #95a5a6;")

        help_btn.clicked.connect(self.show_help)

        layout.addWidget(help_btn)

         

        # 状态栏

        self.status_bar = QLabel("就绪 | 点击按钮开始清理")

        self.status_bar.setAlignment(Qt.AlignCenter)

        self.status_bar.setStyleSheet("""

            QLabel {

                font-size: 13px;

                color: #7f8c8d;

                border-top: 1px solid #bdc3c7;

                padding: 5px;

            }

        """)

        layout.addWidget(self.status_bar)

         

        main_widget.setLayout(layout)

        self.setCentralWidget(main_widget)

     

    def check_admin(self):

        try:

            return ctypes.windll.shell32.IsUserAnAdmin() != 0

        except:

            return False

     

    def confirm_action(self, title, message):

        reply = QMessageBox.question(self, title, message,

                                   QMessageBox.Yes | QMessageBox.No)

        return reply == QMessageBox.Yes

     

    def log_operation(self, action, success=True):

        timestamp = time.strftime("%Y-%m-%d %H:%M:%S")

        try:

            with open("cleanup_log.txt", "a", encoding="utf-8") as f:

                status = "成功" if success else "失败"

                f.write(f"[{timestamp}] {action} {status}\n")

        except Exception as e:

            print(f"日志记录失败: {str(e)}")

     

    def run_command(self, command, description):

        self.status_bar.setText(f"? 正在{description}...")

        self.status_bar.setStyleSheet("color: #3498db; font-weight: bold;")

        QApplication.processEvents()

         

        try:

            result = subprocess.run(command, shell=True, check=True,

                                  stdout=subprocess.PIPE, stderr=subprocess.PIPE,

                                  encoding='gbk', errors='replace')

            self.log_operation(description, True)

            self.cleaned_items += 1

            return True

        except subprocess.CalledProcessError as e:

            error_msg = e.stderr if e.stderr else "未知错误"

            self.status_bar.setText(f"? {description}失败: {error_msg}")

            self.status_bar.setStyleSheet("color: #e74c3c; font-weight: bold;")

            self.log_operation(description, False)

            return False

     

    def clean_temp_files(self):

        if not self.confirm_action("确认清理", "即将扫描并清理以下临时文件:\n\n• 系统临时文件\n• 用户临时文件\n• 预取缓存\n\n是否继续?"):

            return

         

        self.progress.setValue(0)

        commands = [

            ('cleanmgr /sagerun:1', "使用系统磁盘清理工具清理临时文件", 20),

            ('del /f /s /q %TEMP%\\*', "清理用户临时文件夹", 40),

            ('del /f /s /q C:\\Windows\\Temp\\*', "清理系统临时文件夹", 60),

            ('del /f /s /q C:\\Windows\\Prefetch\\*', "清理预取文件", 80)

        ]

         

        for cmd, desc, progress in commands:

            self.run_command(cmd, desc)

            self.progress.setValue(progress)

            time.sleep(1)

         

        self.progress.setValue(100)

        self.status_bar.setText(f"? 临时文件清理完成!共清理 {len(commands)} 个项目")

        self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def empty_recycle_bin(self):

        if not self.confirm_action("确认清空", "即将永久删除回收站中的所有文件!\n此操作不可恢复,是否继续?"):

            return

         

        self.progress.setValue(0)

        if self.run_command('cleanmgr /sagerun:2', "使用系统工具清空回收站"):

            self.progress.setValue(50)

            time.sleep(1)

         

        if not self.run_command('powershell -Command "Clear-RecycleBin -Force -ErrorAction SilentlyContinue"', "强制清空回收站"):

            self.run_command('rd /s /q C:\\$Recycle.bin', "尝试直接清理回收站目录")

         

        self.progress.setValue(100)

        self.status_bar.setText("? 回收站已清空!")

        self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def clean_browser_cache(self):

        if not self.confirm_action("确认清理", "即将清理浏览器缓存:\n\n• Chrome\n• Edge\n• Firefox\n\n请先关闭所有浏览器,是否继续?"):

            return

         

        self.progress.setValue(0)

        userprofile = os.environ.get('USERPROFILE', '')

        if userprofile:

            try:

                userprofile = userprofile.encode('gbk').decode('utf-8', errors='ignore')

            except:

                pass

             

            browsers = [

                ('Google\\Chrome\\User Data\\Default\\Cache', "Chrome 缓存", 30),

                ('Microsoft\\Edge\\User Data\\Default\\Cache', "Edge 缓存", 60),

                ('Mozilla\\Firefox\\Profiles', "Firefox 缓存", 90)

            ]

             

            cleaned = 0

            for path, name, progress in browsers:

                full_path = os.path.join(userprofile, 'AppData', 'Local', path)

                if os.path.exists(full_path):

                    if self.run_command(f'del /f /s /q "{full_path}\\*"', f"清理 {name}"):

                        cleaned += 1

                    self.progress.setValue(progress)

                    time.sleep(1)

             

            self.progress.setValue(100)

            self.status_bar.setText(f"? 已清理 {cleaned} 款浏览器的缓存文件")

            self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def clean_windows_update_cache(self):

        if not self.confirm_action("警告", "清理更新缓存可能导致需要重新下载Windows更新!\n是否继续?"):

            return

         

        self.progress.setValue(0)

        commands = [

            ('net stop wuauserv', "停止Windows更新服务", 10),

            ('net stop bits', "停止BITS服务", 20),

            ('del /f /s /q %windir%\\SoftwareDistribution\\Download\\*', "清理更新下载文件", 40),

            ('net start wuauserv', "启动Windows更新服务", 60),

            ('net start bits', "启动BITS服务", 70),

            ('dism /online /cleanup-image /startcomponentcleanup /resetbase', "清理组件存储", 90)

        ]

         

        for cmd, desc, progress in commands:

            self.run_command(cmd, desc)

            self.progress.setValue(progress)

            time.sleep(1)

         

        self.progress.setValue(100)

        self.status_bar.setText("? Windows更新缓存已清理!建议检查系统更新")

        self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def clean_windows_backup(self):

        if not self.confirm_action("危险操作", "删除Windows.old将无法回退到旧版本系统!\n确定继续吗?"):

            return

         

        self.progress.setValue(0)

        if os.path.exists("C:\\Windows.old"):

            if self.run_command('rmdir /s /q C:\\Windows.old', "清理Windows.old文件夹"):

                self.progress.setValue(50)

                time.sleep(2)

         

        if self.run_command('vssadmin delete shadows /all /quiet', "清理系统还原点"):

            self.progress.setValue(100)

            self.status_bar.setText("? 系统备份文件已彻底删除!")

            self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def clean_log_files(self):

        self.progress.setValue(0)

        commands = [

            ('powershell -Command "wevtutil el | Foreach-Object {wevtutil cl $_}"', "清理事件日志", 30),

            ('del /f /s /q C:\\Windows\\Logs\\CBS\\*', "清理CBS日志", 60),

            ('del /f /s /q C:\\Windows\\System32\\LogFiles\\*', "清理系统日志", 90)

        ]

         

        for cmd, desc, progress in commands:

            self.run_command(cmd, desc)

            self.progress.setValue(progress)

            time.sleep(1)

         

        self.progress.setValue(100)

        self.status_bar.setText("? 系统日志文件已清理!")

        self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def clean_defender_files(self):

        if self.run_command('cleanmgr /sagerun:4', "清理Windows Defender文件"):

            self.status_bar.setText("? Defender防病毒垃圾已清理!")

            self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def clean_iis_logs(self):

        if self.run_command('del /f /s /q %SystemDrive%\\inetpub\\logs\\LogFiles\\*', "清理IIS日志"):

            self.status_bar.setText("? IIS网站日志已清理!")

            self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def clean_hibernation_files(self):

        if not self.confirm_action("确认操作", "禁用休眠功能将影响快速启动和睡眠功能!\n是否继续?"):

            return

         

        if self.run_command('powercfg -h off', "禁用休眠功能并删除休眠文件"):

            self.status_bar.setText("? 休眠文件已删除!如需恢复请重新启用休眠功能")

            self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

     

    def clean_pagefile(self):

        if not self.confirm_action("危险操作",

            "重置虚拟内存可能导致系统不稳定!\n建议仅在磁盘空间严重不足时使用。\n确定继续吗?"):

            return

         

        commands = [

            ('wmic pagefileset delete', "删除虚拟内存设置", 30),

            ('del /f /q C:\\pagefile.sys', "删除分页文件", 70)

        ]

         

        for cmd, desc, progress in commands:

            self.run_command(cmd, desc)

            self.progress.setValue(progress)

            time.sleep(1)

         

        self.run_command('wmic computersystem where name="%computername%" set AutomaticManagedPagefile=True', "恢复自动管理虚拟内存")

        self.progress.setValue(100)

        self.status_bar.setText("?? 虚拟内存已重置!必须重启系统才能生效")

        self.status_bar.setStyleSheet("color: #f39c12; font-weight: bold;")

     

    def clean_all(self):

        if not self.confirm_action("全面清理", "即将执行所有清理操作,可能需要较长时间!\n建议先关闭所有应用程序,是否继续?"):

            return

         

        self.cleaned_items = 0

        operations = [

            ("临时文件", self.clean_temp_files),

            ("回收站", self.empty_recycle_bin),

            ("浏览器缓存", self.clean_browser_cache),

            ("系统更新缓存", self.clean_windows_update_cache),

            ("系统备份", self.clean_windows_backup),

            ("系统日志", self.clean_log_files),

            ("Defender垃圾", self.clean_defender_files),

            ("IIS日志", self.clean_iis_logs),

            ("休眠文件", self.clean_hibernation_files),

            ("虚拟内存", self.clean_pagefile)

        ]

         

        for name, operation in operations:

            self.status_bar.setText(f"? 正在执行 {name} 清理...")

            QApplication.processEvents()

            operation()

            time.sleep(1)

         

        self.status_bar.setText(f"???? 全盘清理完成!共执行 {self.cleaned_items} 项清理,建议重启系统")

        self.status_bar.setStyleSheet("color: #27ae60; font-weight: bold;")

        self.progress.setValue(100)

     

    def show_help(self):

        help_text = """

        <h3>Windows系统清理工具 使用指南</h3>

        <p><b>基本功能:</b></p>

        <ul>

            <li>【一键智能清理】:推荐普通用户使用,自动执行安全清理</li>

            <li>【单独功能清理】:适合高级用户按需选择</li>

        </ul>

        <p><b>注意事项:</b></p>

        <ol>

            <li>部分功能需要管理员权限</li>

            <li>清理前请保存重要文件</li>

            <li>系统更新缓存清理后可能需要重新下载更新</li>

            <li>执行完全清理后建议重启系统</li>

        </ol>

        <p><b>技术支持:创客白泽</b> 遇到问题请查看日志文件 cleanup_log.txt</p>

        """

        QMessageBox.information(self, "使用说明", help_text.strip())

     

    def closeEvent(self, event):

        if self.confirm_action("退出", "确定要退出清理工具吗?"):

            event.accept()

        else:

            event.ignore()

 

def main():

    app = QApplication(sys.argv)

     

    # 设置中文字体

    font = app.font()

    font.setFamily("Microsoft YaHei")

    app.setFont(font)

     

    # 检查管理员权限

    try:

        if not ctypes.windll.shell32.IsUserAnAdmin():

            msg = QMessageBox()

            msg.setIcon(QMessageBox.Warning)

            msg.setWindowTitle("权限警告")

            msg.setText("<b>?? 需要管理员权限</b>")

            msg.setInformativeText("此程序的部分核心功能需要管理员权限才能正常运行。\n\n请右键点击程序,选择【以管理员身份运行】获取完整功能。")

            msg.exec_()

    except:

        pass

     

    window = CleanupTool()

    window.show()

    sys.exit(app.exec_())

 

if __name__ == "__main__":

    main()

文件结构

├── CleanupTool.py      # 主程序
├── requirements.txt    # 依赖库
├── cleanup_log.txt    # 运行日志示例
└── README.md          # 说明文档

七、总结与未来展望

7.1 工具优势总结

较传统清理工具效率提升40%

支持清理12类系统垃圾文件

图形化操作体验友好

完全开源无后门

7.2 未来改进方向

增加清理项自定义选择

添加磁盘空间可视化分析

支持定时自动清理功能

开发多语言版本


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • 使用Python实现Windows系统垃圾清理

    使用Python实现Windows系统垃圾清理
    一、开发背景与工具概述 1.1 为什么需要专业清理工具 在日常使用Windows系统时,我们经常会遇到: 系统盘空间莫名减少 电脑运行速度越来
  • Python处理大量Excel文件的十个技巧
    一、批量读取多个Excel文件 在实际工作中,经常要处理多个Excel文件。用Python批量读取特别方便: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2
  • Python f-string实现高效字符串格式化
    f-string,称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法,该方法源于PEP 498 Literal String Interpolati
  • 无法找到VS Code Python解释器的几种解决办法

    无法找到VS Code Python解释器的几种解决办法
    在编写和运行 Python 代码之前,需要确保 VS Code 知道使用哪个 Python 解释器。 打开刚才创建的 Python 文件(如hello_world.py)。 点击 VS Code 窗口
  • 使用Python开发一个带EPUB转换功能的Markdown编辑器

    使用Python开发一个带EPUB转换功能的Markdown编辑器
    Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式。想象一下,如果你不仅能编辑Markdown,还能实时预
  • 基于PyQt6实现智能视频分割器

    基于PyQt6实现智能视频分割器
    一、开篇碎碎念 最近在整理旅行视频时,发现需要把长视频按场景分割成小片段。试了几款工具都不够顺手,要么操作复杂,要么界面丑陋
  • 使用Python和Pyecharts创建交互式地图

    使用Python和Pyecharts创建交互式地图
    在数据可视化领域,创建交互式地图是一种强大的方式,可以使受众能够以引人入胜且信息丰富的方式探索地理数据。本文将深入探讨如何
  • Python中利用算法优化性能的技巧
    1. 列表推导式(List Comprehension) 列表推导式是一种快速创建列表的方法,它比传统的循环方式更快、更简洁。 代码示例: 1 2 3 4 5 6 7 8 9 1
  • Python实现敏感词过滤的五种方法

    Python实现敏感词过滤的五种方法
    1、replace替换 replace就是最简单的字符串替换,当一串字符串中有可能会出现的敏感词时,我们直接使用相应的replace方法用*替换出敏感词即
  • Python Socket网络编程的7种硬核用法

    Python Socket网络编程的7种硬核用法
    上周老板拍着我的肩膀说:小花啊,我们需要一个在线客服系统,你用 Python 搞个 Socket 聊天室吧! 我心里嘀咕:Socket 不就发发消息、写个
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计