Files
wecom_it_smart_desk/docs_repair_rmdir2.py
T

54 lines
1.6 KiB
Python

# -*- 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")