背景:数据清理脚本批量删旧词表,跑到其中一个目录必挂:
OSError: [WinError 32] 另一个程序正在使用此文件,进程无法访问。
: '蓝海词-A级可争取.csv'
os.remove、重命名、shutil.move 挪盘,全报 32。我以为是有进程开着这个文件。任务管理器翻一遍,杀毒软件锁定列表查一遍,可疑窗口全关掉。没有收获。
结果发现真正怪的是范围:只有这一个目录必挂,别的目录删得好好的。
换个思路。不猜谁占着,固定其他条件,只改一个变量。
cd /c/Users/Administrator/Desktop/词表分析
ls -la # 文件在,看得见
rm -f 蓝海词-A级可争取.csv # 删不掉,还是 32
cd /c/Users/Administrator/Desktop
rm -f 词表分析/蓝海词-A级可争取.csv # 同一个文件,删掉了
结论出来了。shell 的当前目录(cwd)停在目标文件夹里,Windows 据此锁住目录本身。那个窗口没打开任何文件,光「在那儿」就把文件夹钉死——里面的文件照常能复制、能读,删不掉的只有文件夹自己。
工程侧的对法:清理类脚本别让 shell 停在目标目录里,删完就走。更稳的是全程绝对路径,不依赖 cwd。定时任务里 cwd 会跨命令保持,别拿「现在没占用」当判断依据。
有一处我没深究:cwd 锁目录具体锁在 win32 哪一层(目录句柄的共享模式),这次只验证了 A/B 结果,机制没往深挖。
完整排查记录写在博客: