影刀删除应用不干净?时间久了,大量垃圾应用文件占空间?用它!够了!
在使用影刀进行应用开发的过程中,由于不同应用的需求、不同阶段的需求、临时测试的应用等多种原因,可能开发后的应用会被删除,而这些被删除的应用却并没有真正意义上在本地将对应应用的文件也一起删除,这就导致 了一个问题,那就是当时间久了之后,会出现大量的应用文件,久而久之就像大量软件安装在C盘,时间久了占用···...
扫码分享二维码
在使用影刀进行应用开发的过程中,由于不同应用的需求、不同阶段的需求、临时测试的应用等多种原因,可能开发后的应用会被删除,而这些被删除的应用却并没有真正意义上在本地将对应应用的文件也一起删除,这就导致 了一个问题,那就是当时间久了之后,会出现大量的应用文件,久而久之就像大量软件安装在C盘,时间久了占用···...
扫码分享二维码
在使用影刀进行应用开发的过程中,由于不同应用的需求、不同阶段的需求、临时测试的应用等多种原因,可能开发后的应用会被删除,而这些被删除的应用却并没有真正意义上在本地将对应应用的文件也一起删除,这就导致 了一个问题,那就是当时间久了之后,会出现大量的应用文件,久而久之就像大量软件安装在C盘,时间久了占用大量空间一样的道理;而默认状态下影刀的应用文件的确是放在C盘的;

那么我们可以通过这个工具来实现判断哪些应用是被删除了,然后直接一键清理删除的应用数据,并删除对应的文件夹,释放本地空间;


具体实施代码如下:
import os
import sqlite3
import tkinter as tk
from tkinter import ttk
from tkinter import messagebox
import threading
class ShadowBotAppDeleter:
def __init__(self, root):
self.root = root
self.root.title('影刀应用回收站删除_清理本地文件工具')
self.root.geometry('800x600') # 设置窗口大小,美化界面
self.root.configure(bg='#f0f0f0') # 设置背景颜色
# 用户文件夹路径
self.user_folder = 'C:/Users/Administrator/AppData/Local/ShadowBot/users'
# 创建下拉列表,宽度加大一倍
self.user_id_combobox = ttk.Combobox(root, width=40, font=('Arial', 12))
self.user_id_combobox.pack(pady=20)
self.user_id_combobox.bind('<<ComboboxSelected>>', self.load_recycle_bin)
# 创建表格,移除操作列
columns = ('uuid', 'name', 'ownerName')
self.tree = ttk.Treeview(root, columns=columns, show='headings', height=20)
# 修改标题
self.tree.heading('uuid', text='应用UUID')
self.tree.heading('name', text='应用名称')
self.tree.heading('ownerName', text='隶属账号')
# 获取表格宽度
tree_width = 780 # 假设窗口宽度为 780
# 调整列宽度
self.tree.column('uuid', width=int(tree_width * 0.4))
self.tree.column('name', width=int(tree_width * 0.45))
self.tree.column('ownerName', width=int(tree_width * 0.15))
self.tree.pack(pady=20)
# 移除双击事件绑定
# self.tree.bind('<Double-1>', self.on_tree_double_click)
# 添加全选和一键删除按钮
self.select_all_btn = ttk.Button(root, text='全选', command=self.select_all)
self.select_all_btn.pack(side=tk.LEFT, padx=5)
self.delete_all_btn = ttk.Button(root, text='一键删除', command=self.delete_all)
self.delete_all_btn.pack(side=tk.LEFT, padx=5)
# 添加显示删除路径的标签,确保字体大小为 12px
self.delete_path_label = ttk.Label(root, text='当前选择路径: 无', font=('Arial', 12))
self.delete_path_label.pack(side=tk.LEFT, padx=5)
# 绑定选择事件
self.tree.bind('<<TreeviewSelect>>', self.on_tree_select)
# 加载用户ID
self.load_user_ids()
def load_user_ids(self):
user_ids = []
for folder in os.listdir(self.user_folder):
folder_path = os.path.join(self.user_folder, folder)
if os.path.isdir(folder_path):
db_path = os.path.join(folder_path, 'user.db3')
if os.path.isfile(db_path):
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('SELECT ownerName FROM developmentsync_apps_v2 LIMIT 1')
result = cursor.fetchone()
if result:
owner_name = result[0]
user_ids.append(f'{folder}-{owner_name}')
conn.close()
except Exception as e:
print(f'Error reading {db_path}: {e}')
self.user_id_combobox['values'] = user_ids
def load_recycle_bin(self, event=None):
# 清空表格
for i in self.tree.get_children():
self.tree.delete(i)
selected = self.user_id_combobox.get()
if not selected:
return
user_id = selected.split('-')[0]
db_path = os.path.join(self.user_folder, user_id, 'user.db3')
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('''
SELECT uuid, name, ownerName
FROM developmentsync_apps_v2
WHERE isRecycleBin = 1
''')
results = cursor.fetchall()
for row in results:
uuid, name, ownerName = row
# 移除添加删除按钮的代码
self.tree.insert('', 'end', values=(uuid, name, ownerName))
conn.close()
except Exception as e:
messagebox.showerror('错误', f'读取数据库时出错: {e}')
def on_tree_select(self, event):
item = self.tree.selection()
if item:
values = self.tree.item(item, 'values')
uuid = values[0]
selected = self.user_id_combobox.get()
if selected:
user_id = selected.split('-')[0]
folder_path = os.path.join(self.user_folder, user_id, "apps", uuid)
self.delete_path_label.config(text=f'当前选择路径: {folder_path}')
else:
self.delete_path_label.config(text='当前选择路径: 无')
def delete_item(self, uuid, user_id):
db_path = os.path.join(self.user_folder, user_id, 'user.db3')
def delete_thread():
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# 删除数据库记录
cursor.execute('''
DELETE FROM developmentsync_apps_v2
WHERE uuid = ? AND isRecycleBin = 1
''', (uuid,))
# 删除文件夹
folder_path = os.path.join(self.user_folder, user_id, "apps", uuid)
if os.path.isdir(folder_path):
import shutil
shutil.rmtree(folder_path)
conn.commit()
conn.close()
# 刷新列表
self.load_recycle_bin()
messagebox.showinfo('成功', '删除成功')
except Exception as e:
messagebox.showerror('错误', f'删除时出错: {e}')
threading.Thread(target=delete_thread).start()
def select_all(self):
for item in self.tree.get_children():
self.tree.selection_add(item)
def delete_all(self):
selected = self.user_id_combobox.get()
if not selected:
return
user_id = selected.split('-')[0]
items = self.tree.get_children()
if not items:
return
def delete_all_thread():
db_path = os.path.join(self.user_folder, user_id, 'user.db3')
try:
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
for item in items:
values = self.tree.item(item, 'values')
uuid = values[0]
# 删除数据库记录
cursor.execute('''
DELETE FROM developmentsync_apps_v2
WHERE uuid = ? AND isRecycleBin = 1
''', (uuid,))
# 删除文件夹
folder_path = os.path.join(self.user_folder, user_id, "apps", uuid)
if os.path.isdir(folder_path):
# 更新标签显示删除路径
self.root.after(0, self.delete_path_label.config, {'text': f'当前删除路径: {folder_path}'})
import shutil
shutil.rmtree(folder_path)
conn.commit()
conn.close()
# 刷新列表
self.load_recycle_bin()
messagebox.showinfo('成功', '全部删除成功')
# 重置标签显示
self.root.after(0, self.delete_path_label.config, {'text': '当前删除路径: 无'})
except Exception as e:
messagebox.showerror('错误', f'删除时出错: {e}')
threading.Thread(target=delete_all_thread).start()
if __name__ == '__main__':
root = tk.Tk()
app = ShadowBotAppDeleter(root)
root.mainloop()Copyright Notice
当前文章由【付涛】本人原创开发与文案内容写作,内容版权归当前平台所有,如需转载,请务必注明来源及链接,谢谢合作!
本文最后更新发布于【2025-06-19】,某些文章具有时效性,若有错误或已失效,请联系客服
争议处理:针对本站内容若有异义,亦可直接与【法律顾问:易兴俊,律师联系电话:13825799821】直接联系沟通