Flash缓存一键清理工具

作者头像

image.png

成品下载:可在下载区进行下载
代码演示:

import os
import shutil
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import threading
import psutil
from datetime import datetime

class FlashCacheCleaner:
    def __init__(self, root):
        self.root = root
        self.root.title("Flash缓存清理工具 v2.1")
        self.root.geometry("800x650")  # 增加高度确保所有元素可见
        self.root.resizable(True, True)
        self.root.configure(bg="#f0f0f0")

        # 创建主框架
        self.main_frame = ttk.Frame(root)
        self.main_frame.pack(fill=tk.BOTH, expand=True, padx=20, pady=20)

        # 标题
        title_label = ttk.Label(
            self.main_frame,
            text="Flash缓存清理工具",
            font=("Arial", 24, "bold"),
            foreground="#2c3e50"
        )
        title_label.pack(pady=(0, 15))

        # 说明标签
        desc_label = ttk.Label(
            self.main_frame,
            text="此工具可以清理各种模式下的Flash Player缓存,包括普通模式、调试模式和独立调试播放器模式",
            wraplength=700,
            font=("Arial", 10),
            foreground="#7f8c8d"
        )
        desc_label.pack(pady=(0, 20))

        # 缓存类型选择框架
        cache_frame = ttk.LabelFrame(self.main_frame, text="选择要清理的缓存类型", padding=15)
        cache_frame.pack(fill=tk.X, pady=10)

        # 缓存类型复选框
        self.var_normal = tk.BooleanVar(value=True)
        self.var_debug = tk.BooleanVar(value=True)
        self.var_sa_debug = tk.BooleanVar(value=True)

        normal_check = ttk.Checkbutton(
            cache_frame,
            text="普通Flash缓存",
            variable=self.var_normal
        )
        normal_check.grid(row=0, column=0, padx=10, pady=5, sticky=tk.W)

        debug_check = ttk.Checkbutton(
            cache_frame,
            text="调试模式缓存",
            variable=self.var_debug
        )
        debug_check.grid(row=0, column=1, padx=10, pady=5, sticky=tk.W)

        sa_debug_check = ttk.Checkbutton(
            cache_frame,
            text="独立调试播放器缓存",
            variable=self.var_sa_debug
        )
        sa_debug_check.grid(row=0, column=2, padx=10, pady=5, sticky=tk.W)

        # 自定义路径框架
        custom_frame = ttk.LabelFrame(self.main_frame, text="自定义缓存路径 (可选)", padding=15)
        custom_frame.pack(fill=tk.X, pady=10)

        self.custom_path = tk.StringVar()
        custom_entry = ttk.Entry(custom_frame, textvariable=self.custom_path, width=50)
        custom_entry.grid(row=0, column=0, padx=(0, 10), sticky=tk.EW)

        browse_btn = ttk.Button(custom_frame, text="浏览...", command=self.browse_folder)
        browse_btn.grid(row=0, column=1, padx=(0, 10))

        # 进度条
        self.progress = ttk.Progressbar(self.main_frame, orient=tk.HORIZONTAL, length=700, mode='determinate')
        self.progress.pack(pady=15)

        # 日志区域框架 - 使用Frame包装以确保正确布局
        log_frame = ttk.LabelFrame(self.main_frame, text="操作日志", padding=10)
        log_frame.pack(fill=tk.BOTH, expand=True, pady=10)

        # 添加滚动条
        log_container = ttk.Frame(log_frame)
        log_container.pack(fill=tk.BOTH, expand=True)

        scrollbar = ttk.Scrollbar(log_container)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

        self.log_text = tk.Text(
            log_container,
            height=8,
            bg="white",
            fg="#2c3e50",
            wrap=tk.WORD,
            yscrollcommand=scrollbar.set
        )
        self.log_text.pack(fill=tk.BOTH, expand=True)
        scrollbar.config(command=self.log_text.yview)

        # 配置日志标签
        self.log_text.tag_config("info", foreground="blue")
        self.log_text.tag_config("success", foreground="green")
        self.log_text.tag_config("warning", foreground="orange")
        self.log_text.tag_config("error", foreground="red")

        # 按钮框架 - 放在日志区域下方
        button_frame = ttk.Frame(self.main_frame)
        button_frame.pack(pady=15, fill=tk.X)

        # 使用grid布局按钮确保居中
        self.clean_btn = ttk.Button(
            button_frame,
            text="开始清理缓存",
            command=self.start_cleaning,
            width=15
        )
        self.clean_btn.grid(row=0, column=0, padx=5)

        info_btn = ttk.Button(
            button_frame,
            text="关于此工具",
            command=self.show_info,
            width=15
        )
        info_btn.grid(row=0, column=1, padx=5)

        exit_btn = ttk.Button(
            button_frame,
            text="退出",
            command=root.destroy,
            width=15
        )
        exit_btn.grid(row=0, column=2, padx=5)

        # 使按钮居中
        button_frame.columnconfigure((0, 1, 2), weight=1)

        # 状态栏
        self.status_var = tk.StringVar()
        self.status_var.set("就绪")
        status_bar = ttk.Label(root, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W)
        status_bar.pack(side=tk.BOTTOM, fill=tk.X)

        # 初始化缓存路径
        self.cache_paths = {
            "normal": self.get_normal_cache_paths(),
            "debug": self.get_debug_cache_paths(),
            "sa_debug": self.get_sa_debug_cache_paths()
        }

        # 添加演示缓存
        self.create_demo_cache()

        # 初始日志
        self.log("工具已启动,请选择要清理的缓存类型", "info")

    def get_normal_cache_paths(self):
        """获取普通Flash缓存路径"""
        paths = []
        appdata = os.environ.get('APPDATA', '')
        localappdata = os.environ.get('LOCALAPPDATA', '')

        if appdata:
            paths.extend([
                os.path.join(appdata, 'Adobe', 'Flash Player'),
                os.path.join(appdata, 'Macromedia', 'Flash Player')
            ])

        if localappdata:
            paths.extend([
                os.path.join(localappdata, 'Adobe', 'Flash Player'),
                os.path.join(localappdata, 'Macromedia', 'Flash Player')
            ])

        return paths

    def get_debug_cache_paths(self):
        """获取调试模式缓存路径"""
        paths = []
        appdata = os.environ.get('APPDATA', '')

        if appdata:
            paths.extend([
                os.path.join(appdata, 'Macromedia', 'Flash Player', 'Logs'),
                os.path.join(appdata, 'Macromedia', 'Flash Player', '#SharedObjects'),
                os.path.join(appdata, 'Macromedia', 'Flash Player', 'macromedia.com')
            ])

        return paths

    def get_sa_debug_cache_paths(self):
        """获取独立调试播放器缓存路径"""
        paths = []
        userprofile = os.environ.get('USERPROFILE', '')

        if userprofile:
            paths.extend([
                os.path.join(userprofile, 'AppData', 'Roaming', 'Macromedia', 'Flash Player'),
                os.path.join(userprofile, 'AppData', 'Local', 'Macromedia', 'Flash Player')
            ])

        return paths

    def create_demo_cache(self):
        """创建演示用的缓存文件"""
        demo_dirs = [
            os.path.join(os.environ['TEMP'], 'FlashCacheCleanerDemo', 'NormalCache'),
            os.path.join(os.environ['TEMP'], 'FlashCacheCleanerDemo', 'DebugCache'),
            os.path.join(os.environ['TEMP'], 'FlashCacheCleanerDemo', 'SADebugCache'),
        ]

        for demo_dir in demo_dirs:
            os.makedirs(demo_dir, exist_ok=True)

            # 创建一些模拟文件
            for i in range(3):
                with open(os.path.join(demo_dir, f'cache_file_{i}.bin'), 'wb') as f:
                    f.write(os.urandom(1024))

            # 添加到缓存路径
            if "Normal" in demo_dir:
                self.cache_paths["normal"].append(demo_dir)
            elif "Debug" in demo_dir:
                self.cache_paths["debug"].append(demo_dir)
            elif "SADebug" in demo_dir:
                self.cache_paths["sa_debug"].append(demo_dir)

    def browse_folder(self):
        """浏览文件夹"""
        folder = filedialog.askdirectory(title="选择缓存文件夹")
        if folder:
            self.custom_path.set(folder)
            # 在日志中显示添加的路径
            self.log(f"添加自定义缓存路径: {folder}", "info")

    def log(self, message, tag="info"):
        """添加日志消息"""
        timestamp = datetime.now().strftime("%H:%M:%S")
        self.log_text.insert(tk.END, f"[{timestamp}] {message}\n", tag)
        self.log_text.see(tk.END)
        self.status_var.set(message)
        # 确保日志更新
        self.log_text.update_idletasks()

    def start_cleaning(self):
        """开始清理缓存"""
        # 检查是否选择了任何缓存类型
        if not (self.var_normal.get() or self.var_debug.get() or self.var_sa_debug.get()):
            if not self.custom_path.get():
                messagebox.showwarning("警告", "请选择至少一种缓存类型进行清理!")
                return

        # 确认清理
        if not messagebox.askyesno("确认", "确定要清理Flash缓存吗?此操作不可撤销!"):
            return

        # 禁用清理按钮
        self.clean_btn.config(state=tk.DISABLED)

        # 启动清理线程
        threading.Thread(target=self.clean_cache, daemon=True).start()

    def clean_cache(self):
        """执行缓存清理"""
        self.log("开始清理Flash缓存...", "info")
        total_paths = []

        # 收集要清理的路径
        if self.var_normal.get():
            total_paths.extend(self.cache_paths["normal"])
            self.log("已选择清理普通Flash缓存", "info")

        if self.var_debug.get():
            total_paths.extend(self.cache_paths["debug"])
            self.log("已选择清理调试模式缓存", "info")

        if self.var_sa_debug.get():
            total_paths.extend(self.cache_paths["sa_debug"])
            self.log("已选择清理独立调试播放器缓存", "info")

        # 添加自定义路径
        custom_path = self.custom_path.get()
        if custom_path:
            total_paths.append(custom_path)
            self.log(f"已选择清理自定义缓存路径: {custom_path}", "info")

        # 去重
        total_paths = list(set(total_paths))
        total = len(total_paths)

        # 检查Flash Player进程是否正在运行
        flash_processes = self.check_flash_processes()
        if flash_processes:
            self.log(f"检测到 {len(flash_processes)} 个Flash Player进程正在运行", "warning")
            self.log("清理前建议关闭所有Flash Player进程", "warning")

        # 更新进度条
        self.progress["value"] = 0
        self.progress["maximum"] = total if total > 0 else 1

        # 清理每个路径
        cleaned_count = 0
        cleaned_size = 0

        for i, path in enumerate(total_paths):
            self.progress["value"] = i + 1
            self.root.update()

            if os.path.exists(path):
                try:
                    # 计算文件夹大小
                    size = self.get_folder_size(path)

                    # 删除文件夹
                    if os.path.isdir(path):
                        shutil.rmtree(path)
                    else:
                        os.remove(path)

                    self.log(f"已清理: {path} ({self.format_size(size)})", "success")
                    cleaned_count += 1
                    cleaned_size += size

                    # 重新创建目录(防止应用程序出错)
                    if "Logs" not in path and "SharedObjects" not in path:
                        os.makedirs(path, exist_ok=True)
                except Exception as e:
                    self.log(f"清理失败: {path} - {str(e)}", "error")
            else:
                self.log(f"路径不存在: {path}", "warning")

        # 显示清理结果
        if cleaned_count > 0:
            self.log(f"清理完成! 共清理 {cleaned_count}/{total} 个目录, 释放空间: {self.format_size(cleaned_size)}",
                     "success")
        else:
            self.log("没有找到可清理的缓存", "info")

        self.clean_btn.config(state=tk.NORMAL)

        # 进度条重置
        self.root.after(5000, lambda: self.progress.config(value=0))

    def check_flash_processes(self):
        """检查正在运行的Flash Player进程"""
        flash_processes = []
        for proc in psutil.process_iter(['name']):
            name = proc.info.get('name', '').lower()
            if name and "flash" in name:
                flash_processes.append(proc.info['name'])
        return flash_processes

    def get_folder_size(self, folder):
        """计算文件夹大小(字节)"""
        total_size = 0
        for dirpath, dirnames, filenames in os.walk(folder):
            for f in filenames:
                fp = os.path.join(dirpath, f)
                if os.path.exists(fp):
                    try:
                        total_size += os.path.getsize(fp)
                    except OSError:
                        continue
        return total_size

    def format_size(self, size):
        """格式化文件大小"""
        if size == 0:
            return "0 B"

        units = ['B', 'KB', 'MB', 'GB']
        unit_index = 0

        while size >= 1024 and unit_index < len(units) - 1:
            size /= 1024.0
            unit_index += 1

        return f"{size:.1f} {units[unit_index]}"

    def show_info(self):
        """显示关于信息"""
        info_text = """Flash缓存清理工具 v2.1

功能:
- 清理普通Flash Player缓存
- 清理调试模式Flash缓存
- 清理独立调试播放器(flashplayer_sa_debug.exe)缓存
- 支持自定义缓存路径
- 显示详细清理日志

重要提示:
1. 清理前请关闭所有使用Flash的应用程序
2. 清理后可能需要重启浏览器才能生效
3. 此工具会保留必要的目录结构

系统要求:
- Windows 7/10/11
- Python 3.6+

发布日期: 2023-08-20
        """
        messagebox.showinfo("关于此工具", info_text)

if __name__ == "__main__":
    root = tk.Tk()
    app = FlashCacheCleaner(root)
    root.mainloop()

下载地址:

迅雷网盘
本站资源仅供学习交流使用请勿商业运营,严禁使用模板&源码从事违法,侵权等非法活动!如链接失效内容有误,请到评论反馈。

免费声明

  1. 本网站的文章内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长QQ:304906607进行删除处理。
  2. 文章采用: 《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)。
  3. 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新。
  4. 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
  5. 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
  6. 本站永久网址:https://www.aybk.cn
MiniMax 3.1.0发布:国内AI技术新突破,多模态大模型引领未来
« 上一篇 07-17
阿影收集2800+图标合集dll格式 + 2800+单个ico文件
下一篇 » 07-17

发表评论

请先登录后才能发表评论

没有更多评论了

个人信息

HI好朋友 ! 请登录
开通会员,享受下载全站资源特权。
百度一下

随便看看

大家都在看

2025年 乙巳年 蛇年
13 : 36 : 00
公历日期
9月26日
农历日期
八月初五
星期
星期五
下午好
金秋时节,愿您收获满满
距离国庆节还有5天
登陆
还没有账号?立即注册
点击按钮进行验证
忘记密码?
登陆
忘记密码
已经有账号?马上登陆
获取验证码
重新获取(60s)
点击按钮进行验证
重置密码
注册
已经有账号?马上登陆
获取验证码
重新获取(60s)
点击按钮进行验证
立即注册