193 lines
7.6 KiB
Python
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() |