# -*- coding: utf-8 -*- """用 ctypes RemoveDirectoryW 直接删除空目录(绕过 safe-delete 回收站钩子)。""" import os, ctypes, sys ROOT = "docs" kernel32 = ctypes.windll.kernel32 DRY = "--go" not in sys.argv REMAIN = ["09-部署运维", "10-项目管理", "11-历史归档"] def norm(d): return os.path.normpath(os.path.join(ROOT, d)) # 收集所有空目录(含嵌套),按深度降序删除 def collect_empty(d): out = [] for root, dirs, files in os.walk(d): if not files: # 仅当该目录下无任何文件(子目录稍后递归删空) out.append(root) # 按路径深度降序 out.sort(key=lambda p: p.count(os.sep), reverse=True) return out all_empty = [] for d in REMAIN: dp = norm(d) if os.path.isdir(dp): # 先确认整棵树无文件 files = [os.path.join(r, f) for r, _, fs in os.walk(dp) for f in fs] if files: print("!! 非空,跳过:", d, files[:5]); continue all_empty += collect_empty(dp) print("待删空目录数:", len(all_empty)) if DRY: for p in all_empty: print(" ", p) else: for p in all_empty: lp = ctypes.c_wchar_p(os.path.abspath(p)) ok = kernel32.RemoveDirectoryW(lp) if not ok: print("FAIL", p, "err", kernel32.GetLastError()) else: print("RM", p) # 最后删顶层(若空) for d in REMAIN: dp = norm(d) if os.path.isdir(dp): lp = ctypes.c_wchar_p(os.path.abspath(dp)) kernel32.RemoveDirectoryW(lp) print("DONE")