This commit is contained in:
muye 2024-04-19 09:55:49 +08:00
parent 7a0b8d5d29
commit ba837ddccc

264
keilprojectClean/clean.py Normal file
View File

@ -0,0 +1,264 @@
import os
import sys
import shutil
import msvcrt
import xml.etree.ElementTree as ET
# 搜索根目录
root_directory = "."
def print_blue(text):
print("\x1b[34m" + text + "\x1b[0m")
def print_green(text):
print("\x1b[32m" + text + "\x1b[0m")
def print_red(text):
print("\x1b[31m" + text + "\x1b[0m")
def build_delete_files_structure(root_dir, condition_value, condition_type="extension"):
delete_files_structure = {}
# 获取目录下所有文件
for root, _, files in os.walk(root_dir, topdown=False):
delete_files = []
for file_name in files:
file_path = os.path.join(root, file_name)
if condition_type == "contains" and condition_value in file_path:
delete_files.append(file_path)
elif condition_type == "equals" and condition_value == file_name:
delete_files.append(file_path)
elif condition_type == "extension" and file_name.endswith(condition_value):
delete_files.append(file_path)
delete_files_structure[root] = delete_files
return delete_files_structure
def build_delete_folders_structure(root_dir, condition_value, condition_type="contains"):
delete_folders_structure = {}
# 获取目录下所有文件夹
for root, dirs, _ in os.walk(root_dir, topdown=False):
delete_folders = []
for folder_name in dirs:
folder_path = os.path.join(root, folder_name)
if condition_type == "contains" and condition_value in folder_path:
delete_folders.append(folder_path)
elif condition_type == "equals" and condition_value == folder_name:
delete_folders.append(folder_path)
delete_folders_structure[root] = delete_folders
return delete_folders_structure
def delete_files(delete_structure):
"""
删除文件
Parameters:
delete_structure (dict): 删除文件的结构键是根目录路径值是要删除的文件列表
"""
errors = [] # 记录删除文件时的异常信息
for root, files in delete_structure.items():
for file_path in files:
try:
os.remove(file_path)
print(f"Deleted file: {file_path}")
except PermissionError as e:
errors.append(f"Permission error deleting {file_path}: {e}")
except OSError as e:
errors.append(f"Error deleting {file_path}: {e}")
return errors
def delete_folders(delete_structure):
"""
删除文件夹及其内容
Parameters:
delete_structure (dict): 删除文件夹的结构键是根目录路径值是要删除的文件夹列表
"""
errors = [] # 记录删除文件夹时的异常信息
for root, folders in delete_structure.items():
for folder_path in folders:
try:
shutil.rmtree(folder_path)
print(f"Deleted folder: {folder_path}")
except PermissionError as e:
errors.append(f"Permission error deleting folder {folder_path}: {e}")
except OSError as e:
errors.append(f"Error deleting folder {folder_path}: {e}")
return errors
def delete_empty_folders(delete_structure):
"""
删除空文件夹
Parameters:
delete_structure (dict): 删除文件夹的结构键是根目录路径值是要删除的文件夹列表
"""
errors = [] # 记录删除文件夹时的异常信息
for root, folders in delete_structure.items():
for folder_path in folders:
if not os.listdir(folder_path):
try:
os.rmdir(folder_path)
print(f"Deleted empty folder: {folder_path}")
except PermissionError as e:
print(f"Permission error deleting empty folder {folder_path}: {e}")
except OSError as e:
print(f"Error deleting empty folder {folder_path}: {e}")
def find_and_rename_files(root_dir, find_file_suffix, replace_name_path, replace_suffix):
finded_files = []
errors = [] # 记录重命名文件时的异常信息
for foldername, subfolders, filenames in os.walk(root_dir):
for filename in filenames:
if filename.endswith(find_file_suffix):
file_path = os.path.join(foldername, filename)
finded_files.append(file_path)
for file_path in finded_files:
try:
# 获取上两级目录的名称
upper_dirs = os.path.normpath(os.path.join(file_path, replace_name_path))
upper_dirs = os.path.basename(upper_dirs)
# 构建新的文件名
new_filename = f"{upper_dirs}" + replace_suffix
# 构建新的文件路径
new_file_path = os.path.join(os.path.dirname(file_path), new_filename)
# 检查新的文件名是否与当前文件名相同
if new_filename != os.path.basename(file_path):
# 重命名文件
os.rename(file_path, new_file_path)
print(f"Renamed: {file_path} to {new_file_path}")
# else:
# # print(f"Rename Skipping as same name: {file_path}")
except PermissionError:
errors.append(f"Permission error renaming file {file_path}: {e}")
except FileNotFoundError:
errors.append(f"error{file_path}: {e},file not found")
except OSError as e:
errors.append(f"Error renaming empty folder {file_path}: {e}")
return errors
def wait_for_any_key():
print_green("ALL success and press any key to continue...")
msvcrt.getch()
def sysExit_wait_for_any_key():
print_red("Please check the error and press any key to exit...")
msvcrt.getch()
sys.exit(1)
# 构建删除结构,指定要删除的文件后缀名(例如 ".txt"extension==后缀 contains==包含 equals==相等
delete_structure_data_yaml = build_delete_files_structure(root_directory, "yml",condition_type="extension")
delete_structure_data_ini = build_delete_files_structure(root_directory, "ini",condition_type="extension")
delete_structure_data_txt = build_delete_files_structure(root_directory, "txt",condition_type="extension")
delete_structure_data_json = build_delete_files_structure(root_directory, "json",condition_type="extension")
delete_structure_data_scvd = build_delete_files_structure(root_directory, "scvd",condition_type="extension")
delete_structure_data_clangd = build_delete_files_structure(root_directory, "clangd",condition_type="extension")
delete_structure_data_uvguix = build_delete_files_structure(root_directory, "uvguix",condition_type="contains")
#delete_structure_data_sct = build_delete_files_structure(root_directory, "sct",condition_type="extension")
delete_structure_data_cfg = build_delete_files_structure(root_directory, "cfg",condition_type="extension")
# 构建删除结构,指定要删除的文件夹名称 contains==包含 equals==相等
delete_structure_DebugConfig = build_delete_folders_structure(root_directory,"DebugConfig",condition_type="equals")
delete_structure_Listings = build_delete_folders_structure(root_directory,"Listings",condition_type="equals")
delete_structure_Objects = build_delete_folders_structure(root_directory,"Objects",condition_type="equals")
delete_structure_RTE = build_delete_folders_structure(root_directory,"RTE",condition_type="equals")
delete_structure_output = build_delete_folders_structure(root_directory,"output",condition_type="equals")
delete_structure_build = build_delete_folders_structure(root_directory,"build",condition_type="equals")
print_blue('\n')
print_blue('******************************************************************************************')
print_blue('********************************* begin to delete files **********************************')
print_blue('******************************************************************************************')
# 存储所有的文件操作异常信息
all_file_errors = []
# 调用多次删除文件函数,并汇总异常信息
all_file_errors.extend(delete_files(delete_structure_data_yaml))
all_file_errors.extend(delete_files(delete_structure_data_ini))
all_file_errors.extend(delete_files(delete_structure_data_txt))
all_file_errors.extend(delete_files(delete_structure_data_json))
all_file_errors.extend(delete_files(delete_structure_data_scvd))
all_file_errors.extend(delete_files(delete_structure_data_clangd))
all_file_errors.extend(delete_files(delete_structure_data_uvguix))
#all_file_errors.extend(delete_files(delete_structure_data_sct))
all_file_errors.extend(delete_files(delete_structure_data_cfg))
print_blue('\n')
print_blue('******************************************************************************************')
print_blue('******************************** begin to delete folders *********************************')
print_blue('******************************************************************************************')
# 存储所有的文件操作异常信息
all_folders_errors = []
# 调用多次删除文件函数,并汇总异常信息
all_folders_errors.extend(delete_folders(delete_structure_DebugConfig))
all_folders_errors.extend(delete_folders(delete_structure_Listings))
all_folders_errors.extend(delete_folders(delete_structure_Objects))
all_folders_errors.extend(delete_folders(delete_structure_RTE))
all_folders_errors.extend(delete_folders(delete_structure_output))
all_folders_errors.extend(delete_folders(delete_structure_build))
print_blue('\n')
print_blue('******************************************************************************************')
print_blue('********************************* begin to rename files **********************************')
print_blue('******************************************************************************************')
# 存储所有的文件操作异常信息
all_find_and_rename_errors = []
all_find_and_rename_errors.extend(find_and_rename_files(".",".uvprojx","../..",".uvprojx"))
all_find_and_rename_errors.extend(find_and_rename_files(".",".uvoptx","../..",".uvoptx"))
print('\r\n')
print_red('******************************************************************************************')
print_red('************************************* Errors summary *************************************')
print_red('******************************************************************************************')
# 输出删除文件时的异常信息
error_count = 1
for error in all_file_errors:
print_red(f"{error_count}. {error}")
error_count += 1
# 输出删除文件夹时的异常信息
error_count = 1
for error in all_folders_errors:
print_red(f"{error_count}. {error}")
error_count += 1
# 输出删除文件夹时的异常信息
error_count = 1
for error in all_find_and_rename_errors:
print_red(f"{error_count}. {error}")
error_count += 1
print('\r\n')
# 检查是否有异常信息,等待用户确认
if all_file_errors or all_folders_errors or all_find_and_rename_errors:
sysExit_wait_for_any_key()
else:
print_green('No errors')
print('\r\n')
# 在控制台等待用户按下任意键
wait_for_any_key()