在运行copytree之前,是否有一种简单的方法可以让系统有足够的时间删除文件夹

PyN*_*bie 3 python windows shutil

我有一些目录,我需要更新我使用以下代码

for newdir in newdirs:
    olddir = newdir.replace('h:\\','G:\\').replace('_academic','')
    shutil.rmtree(newdir)
    shutil.copytree(olddir,newdir)
Run Code Online (Sandbox Code Playgroud)

我偶尔会收到一个错误

WindowsError: [Error 5] Access is denied: 'h:\\mydir\\sub1\\sub2\\sub3\\sub4\\sub5'
Run Code Online (Sandbox Code Playgroud)

因为错误不会发生在以前的目录上我决定原因必须是一些访问冲突 - 在rmtree调用和copytree之间发生的时间太少所以我修改了代码以浪费一些时间

for newdir in newdirs:
    olddir = newdir.replace('h:\\','G:\\').replace('_academic','')
    shutil.rmtree(newdir)
    for item in range(0,20,1):
        pass
    shutil.copytree(olddir,newdir)
Run Code Online (Sandbox Code Playgroud)

这使错误消失,旧目录被复制到新位置.

我不喜欢这个,因为它看起来很摇摇欲坠 - 即使对我来说也是如此.

  1. 我错误的原因是错误的(冲突)
  2. 在开始copytree之前,有没有更好的方法来确保系统有足够的时间来完成rmtree操作?

mhl*_*ter 5

如果等待时错误消失,你可能没有错.所以跟进等待的想法,但是有目的地等待,这可能会稍微好一点:

for newdir in newdirs:
    olddir = newdir.replace('h:\\','G:\\').replace('_academic','')
    shutil.rmtree(newdir)
    while os.path.exists(newdir): # check if it exists
        pass
    shutil.copytree(olddir,newdir)
Run Code Online (Sandbox Code Playgroud)

如果发生一些奇怪的错误导致目录被删除但没有引发异常,while理论上循环可能会永远存在,但我发现这种情况不太可能发生.

我不是这个解决方案感到骄傲可言,但禁止新的知识,这应该是一个多一点防呆不是任意延迟.