keil_clean/clean12.py
2024-04-30 09:19:40 +00:00

193 lines
7.6 KiB
Python

import os
import re
import shutil
import tkinter as tk
from tkinter import messagebox, scrolledtext, END
dir_del_log = []
file_del_log = []
rename_log = []
error_log = []
def message_box(title, message):
root = tk.Tk()
root.withdraw()
messagebox.showinfo(title, message)
return
def delete_dir(target, parent):
for root, dirs, files in os.walk(parent, topdown=False):
for name in dirs:
if name == target:
try:
shutil.rmtree(os.path.join(root, name))
dir_del_log.append('删除目录 ' + os.path.join(root, name))
except Exception as e:
error_log.append(e)
return
def delete_files(target, parent):
for root, dirs, files in os.walk(parent, topdown=False):
for name in files:
if target in name:
try:
os.remove(os.path.join(root, name))
file_del_log.append('删除文件 ' + os.path.join(root, name))
except Exception as e:
error_log.append(e)
return
def rename_files(target, parent):
for root, dirs, files in os.walk(parent, topdown=False):
for name in files:
if name.endswith(target):
try:
relative_path = os.path.relpath(root, parent)
new_name_prefix = os.path.basename(os.path.dirname(relative_path))
new_name = new_name_prefix + target
new_path = os.path.join(root, new_name)
old_path = os.path.join(root, name)
if new_name != name:
os.rename(old_path, new_path)
rename_log.append(f"重命名 {old_path}{new_path}")
else:
#print(f"Skipped renaming {name} as the new name is the same as the old one.")
print("")
except Exception as e:
error_log.append(e)
return
def tagname_modify(target, parent):
for root, dirs, files in os.walk(parent, topdown=False):
for name in files:
if name.endswith(target):
try:
pro = os.path.basename(os.path.dirname(root))
# print(pro)
file_path = os.path.join(root, name)
with open(file_path, 'r') as f:
file_content = f.read()
new_content = re.sub(r'<TargetName>.*?</TargetName>', f'<TargetName>{pro}</TargetName>', file_content)
new_content = re.sub(r'<OutputName>.*?</OutputName>', f'<OutputName>{pro}</OutputName>', new_content)
with open(file_path, 'w') as f:
f.write(new_content)
#print(f"Modified {file_path}")
except Exception as e:
error_log.append(e)
def format_all_logs(dir_del_log, file_del_log, rename_log, error_log):
all_logs = []
if dir_del_log:
all_logs.append("\n已删除目录:\n" + "\n".join(dir_del_log))
if file_del_log:
all_logs.append("\n已删除文件:\n" + "\n".join(file_del_log))
if rename_log:
all_logs.append("\n重命名文件:\n" + "\n".join(rename_log))
if error_log:
all_logs.append("\n错误统计:\n" + "\n".join(error_log))
return "\n".join(all_logs)
class FileManagerApp(tk.Tk):
def __init__(self):
super().__init__()
self.title("Keil文件清理")
self.geometry("780x620")
main_frame = tk.Frame(self)
main_frame.pack(padx=20, pady=20)
auto_frame = tk.LabelFrame(main_frame, text="自动清理", padx=20, pady=20)
auto_frame.grid(row=0, column=0, sticky="nsew")
tk.Label(auto_frame, text="自动模式会在当前目录递归搜索并删除以下目录和文件:").pack()
tk.Label(auto_frame, text="Objects、Listings、uvguix文件\n").pack()
tk.Label(auto_frame, text="同时将以下文件重命名为'../../'目录的名称:").pack()
tk.Label(auto_frame, text="uvprojx文件、uvoptx文件\n").pack()
tk.Button(auto_frame, text="开始清理", command=self.run_default_operations).pack()
manual_frame = tk.LabelFrame(main_frame, text="手动清理", padx=20, pady=20)
manual_frame.grid(row=0, column=1, sticky="nsew")
tk.Label(manual_frame, text="输入需要删除的【文件夹】全称(区分大小写),以逗号隔开:").pack()
tk.Label(manual_frame, text="(将递归搜索与这些名称完全匹配的文件夹,并删除)").pack()
self.delete_d = tk.Entry(manual_frame)
self.delete_d.pack(fill=tk.X, padx=5, pady=5)
tk.Button(manual_frame, text="清理文件夹", command=self.execute_directory).pack()
tk.Label(manual_frame, text="\n\n输入需要删除的【文件】部分名称,以逗号隔开:").pack()
tk.Label(manual_frame, text="(将递归搜索包含这些名称(区分大小写)的文件,并删除)").pack()
tk.Label(manual_frame, text="(注意:是包含名称就会被删除,慎用!)").pack()
self.delete_f = tk.Entry(manual_frame)
self.delete_f.pack(fill=tk.X, padx=5, pady=5)
tk.Button(manual_frame, text="清理文件", command=self.execute_file).pack()
log_frame = tk.LabelFrame(main_frame, text="执行日志", padx=20, pady=20)
log_frame.grid(row=1, column=0, columnspan=2, sticky="nsew")
self.log_text = scrolledtext.ScrolledText(log_frame, state='disabled', height=10)
self.log_text.pack(fill=tk.BOTH, expand=True)
self.log_text.configure(state='normal')
self.status_bar = tk.Label(self, text="Ready ", anchor="w", relief=tk.SUNKEN, bd=1)
self.status_bar2 = tk.Label(self, text= "当前目录:" +os.getcwd(), anchor="w", relief=tk.SUNKEN, bd=1)
self.status_bar.pack(side=tk.BOTTOM, fill=tk.X)
self.status_bar2.pack(side=tk.BOTTOM, fill=tk.X)
def run_default_operations(self):
delete_dir("Objects", '.')
delete_dir("Listings", '.')
delete_files(".uvguix.",'.')
rename_files('.uvprojx', '.')
rename_files('.uvoptx', '.')
tagname_modify('.uvprojx', '.')
self.update_logs()
self.status_bar.config(text="Operations completed.")
pass
def execute_directory(self):
delete_dir_list = self.delete_d.get().split(',')
for target in delete_dir_list:
if target.strip():
delete_dir(target.strip(), '.')
self.update_logs()
self.status_bar.config(text="Operations completed.")
def execute_file(self):
delete_file_list = self.delete_f.get().split(',')
for target in delete_file_list:
if target.strip():
delete_files(target.strip(), '.')
self.update_logs()
self.status_bar.config(text="Operations completed.")
def update_logs(self):
all_logs_formatted = format_all_logs(dir_del_log, file_del_log, rename_log, error_log)
self.log_text.configure(state='normal')
self.log_text.delete(1.0, END)
self.log_text.insert(tk.END, all_logs_formatted)
self.log_text.configure(state='disabled')
if __name__ == '__main__':
app = FileManagerApp()
app.mainloop()