猫史档案馆


【Python作品分享】磁盘清理君2.0【作品秀】

用户:忙碌的程序猿忙碌的程序猿查看:0 回复:0 评论:0 创建时间:2023-08-27T16:40:02


【作品展示】

center_image

 

【作品介绍】

方便快捷,操作简单,高效清理,用于专门的磁盘清理工具。

 

【作品源代码】

import os
import shutil
import tkinter as tk
from tkinter import filedialog, messagebox

# 创建主窗口
window = tk.Tk()
window.title("由隋非凡制作 - 磁盘分析器")
window.geometry("360x750")

# 备份文件夹路径
backup_folder = "C:/beifen"


def get_disk_partitions():
    """获取系统中的磁盘分区列表"""
    partitions = []
    if os.name == "nt":
        import string
        for letter in string.ascii_uppercase:
            drive_path = letter + ":/"
            if os.path.isdir(drive_path):
                partitions.append(drive_path)
    else:
        partitions.append("/")
    return partitions


def scan_disk():
    """扫描选择磁盘"""
    disk_path = filedialog.askdirectory()
    if disk_path:
        file_types = {
            "重复文件": set(),
            "日志文件": set(),
            "安装包": set(),
            "垃圾文件": set()
        }
        total_size = 0

        # 遍历磁盘中的所有文件
        for dirpath, dirnames, filenames in os.walk(disk_path):
            for filename in filenames:
                file_path = os.path.join(dirpath, filename)
                file_size = os.path.getsize(file_path)
                total_size += file_size

                # 判断文件类型并添加到对应的文件类型集合中
                if filename.endswith(".log"):
                    file_types["日志文件"].add(file_path)
                elif filename.endswith(".exe") or filename.endswith(".msi"):
                    file_types["安装包"].add(file_path)
                elif filename.endswith(".bak") or filename.endswith(".tmp"):
                    file_types["垃圾文件"].add(file_path)
                else:
                    with open(file_path, "rb") as file:
                        content = file.read()
                    if content in file_types["重复文件"]:
                        file_types["重复文件"].add(file_path)
                    else:
                        file_types["重复文件"].discard(content)

        # 清空窗口内容
        for widget in result_frame.winfo_children():
            widget.destroy()

        # 显示扫描结果
        tk.Label(result_frame, text="垃圾文件总大小:").grid(
            row=0, column=0, sticky="w")
        tk.Label(result_frame, text="{:.2f} MB".format(
            total_size / (1024 * 1024))).grid(row=0, column=1, sticky="w")
        tk.Label(result_frame, text="").grid(row=1, column=0, columnspan=2)
        tk.Label(result_frame, text="重复文件:").grid(
            row=2, column=0, columnspan=2, sticky="w")
        tk.Listbox(result_frame, selectmode=tk.MULTIPLE, height=5, width=50, selectbackground="lightblue",
                   selectborderwidth=0, exportselection=False, yscrollcommand=True,
                   listvariable=tk.StringVar(value=list(file_types["重复文件"]))).grid(row=3, column=0, columnspan=2)
        tk.Label(result_frame, text="").grid(row=4, column=0, columnspan=2)
        tk.Label(result_frame, text="日志文件:").grid(
            row=5, column=0, columnspan=2, sticky="w")
        tk.Listbox(result_frame, selectmode=tk.MULTIPLE, height=5, width=50, selectbackground="lightblue",
                   selectborderwidth=0, exportselection=False, yscrollcommand=True,
                   listvariable=tk.StringVar(value=list(file_types["日志文件"]))).grid(row=6, column=0, columnspan=2)
        tk.Label(result_frame, text="").grid(row=7, column=0, columnspan=2)
        tk.Label(result_frame, text="安装包:").grid(
            row=8, column=0, columnspan=2, sticky="w")
        tk.Listbox(result_frame, selectmode=tk.MULTIPLE, height=5, width=50, selectbackground="lightblue",
                   selectborderwidth=0, exportselection=False, yscrollcommand=True,
                   listvariable=tk.StringVar(value=list(file_types["安装包"]))).grid(row=9, column=0, columnspan=2)
        tk.Label(result_frame, text="").grid(row=10, column=0, columnspan=2)
        tk.Label(result_frame, text="垃圾文件:").grid(
            row=11, column=0, columnspan=2, sticky="w")
        tk.Listbox(result_frame, selectmode=tk.MULTIPLE, height=10, width=50, selectbackground="lightblue",
                   selectborderwidth=0, exportselection=False, yscrollcommand=True,
                   listvariable=tk.StringVar(value=list(file_types["垃圾文件"]))).grid(row=12, column=0, columnspan=2)


def clean_files():
    """清理垃圾文件"""
    selected_files = []

    # 获取所有被选中的文件
    for lb in result_frame.winfo_children():
        if isinstance(lb, tk.Listbox) and lb.curselection():
            selected_index = lb.curselection()
            file_paths = lb.get(0, tk.END)
            selected_files += [file_paths[index] for index in selected_index]

    if selected_files:
        try:
            if not os.path.exists(backup_folder):
                os.makedirs(backup_folder)

            # 将选中的文件进行备份
            for file_path in selected_files:
                filename = os.path.basename(file_path)
                shutil.copy2(file_path, os.path.join(backup_folder, filename))

            messagebox.showinfo("备份成功", "备份文件已保存至:" + backup_folder)

            # 删除选中的文件
            for file_path in selected_files:
                os.remove(file_path)

            messagebox.showinfo("清理完成", "垃圾文件已成功删除!")
            scan_disk()
        except Exception as e:
            messagebox.showerror("错误", "清理过程中出现错误:" + str(e))
    else:
        messagebox.showwarning("未选中文件", "请先选择要清理的文件!")


def open_backup_folder():
    """打开备份文件夹"""
    if os.path.exists(backup_folder):
        os.startfile(backup_folder)
    else:
        messagebox.showwarning("文件夹不存在", "备份文件夹不可访问!")


def show_help():
    """显示帮助信息"""
    messagebox.showinfo("帮助", "备份文件保存在:" + backup_folder)


# 创建选择磁盘部分的窗口部件
select_disk_frame = tk.Frame(window)
select_disk_frame.pack(pady=10)

tk.Label(select_disk_frame, text="选择磁盘:").grid(row=0, column=0)

# 动态加载磁盘分区列表
disks = get_disk_partitions()
disk_variable = tk.StringVar(value=disks)
tk.OptionMenu(select_disk_frame, disk_variable, *disks).grid(row=0, column=1)

# 创建扫描和清理按钮部分的窗口部件
action_frame = tk.Frame(window)
action_frame.pack(pady=10)

scan_button = tk.Button(action_frame, text="扫描", command=scan_disk)
scan_button.grid(row=0, column=0, padx=10)

clean_button = tk.Button(action_frame, text="一键清理", command=clean_files)
clean_button.grid(row=0, column=1, padx=10)

# 创建显示扫描结果部分的窗口部件
result_frame = tk.Frame(window)
result_frame.pack(pady=10)

# 创建备份按钮
backup_button = tk.Button(window, text="备份", command=open_backup_folder)
backup_button.pack(pady=10)

# 创建帮助按钮
help_button = tk.Button(window, text="帮助", command=show_help)
help_button.pack(pady=10)

# 运行主程序
window.mainloop()

 

【提示】

部分含有Python第三方库相关内容的作品,在海龟编辑器网页端无法运行哦!如遇到这种情况,可以打开下面的链接,下载海龟编辑器客户端:

https://python.codemao.cn


回复

上一页1 页 / 共 0下一页