我有一些我需要更新的目录,我正在使用以下代码
for newdir in newdirs:
olddir = newdir.replace('h:\','G:\').replace('_academic','')
shutil.rmtree(newdir)
shutil.copytree(olddir,newdir)
我偶尔会出错
WindowsError: [Error 5] Access is denied: 'h:\mydir\sub1\sub2\sub3\sub4\sub5'
由于该错误不会在以前的目录上发生,因此我认为原因必须是访问冲突 - rmtree呼叫和模仿者之间发生的时间太少了,所以我修改了代码以浪费一些时间
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)
这使该错误消失了,并且将旧目录复制到了新位置。
我不喜欢这个,因为它看起来很摇摇欲坠 - 即使对我来说也是如此。
- 我对错误的原因(冲突) 是错误的
- 是否有更好的方法来确保系统有足够的时间完成rmtree操作,然后才能开始模仿者?
如果您等待时错误消失,那么原因可能并没有错。因此,跟进等待的想法,但要等待目的,这可能会更好更好:
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)
如果发生一些奇怪的错误,请阻止目录被删除,但不会引起例外,while
循环理论上可以永远发生,但是我发现这不太可能。
我根本不为此解决方案感到骄傲,但是除非新知识,否则这应该比任意延迟更愚蠢。