54 lines
1.6 KiB
Python
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")
|