是否有一种万无一失的方法可以给系统足够的时间在运行CopyTree之前删除文件夹



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

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)

这使该错误消失了,并且将旧目录复制到了新位置。

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

  1. 我对错误的原因(冲突)
  2. 是错误的
  3. 是否有更好的方法来确保系统有足够的时间完成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循环理论上可以永远发生,但是我发现这不太可能。

我根本不为此解决方案感到骄傲,但是除非新知识,否则这应该比任意延迟更愚蠢。

最新更新