任何人都可以解释shutil.rmtree和shutil.copytree这种奇怪的行为吗?

时间:2014-12-23 18:02:25

标签: python windows shutil

我正在构建一个相对简单的应用程序,它询问目录,检查它们是否正确,然后删​​除其中一个并使用另一个内容重新创建它。我遇到了这种奇怪的行为,我会试着解释一下:

当我打开目标文件夹窗口时,它是空的,有一个访问被拒绝的异常,然后我被踢出文件夹并被删除。但是如果它不是空的,它可以正常工作,没有例外,目标目录(从它看起来)被清空然后填充源目录中的文件。这很奇怪,因为无论如何都应该直接删除目标文件夹,然后使用源目标中的相同名称和内容重新创建它。

这对我来说没有意义,当我浏览目录时它不是空的时候不应该有完全相同的异常吗?有什么区别,它仍然应该删除该文件夹。对此有任何合理的解释吗?另外,如果有异常,为什么目录会被删除呢?

此特定部分的代码非常简单(请记住我是初学者:))

def Delete(self, dest):

    try:
        shutil.rmtree(dest)
        self.Paste(self.src, dest)
    except (IOError, os.error) as e:
        print e

def Paste(self, src, dest):

    try:
        shutil.copytree(src, dest)
    except (IOError, os.error) as e:
        print e

1 个答案:

答案 0 :(得分:1)

这是Windows上的预期行为。

内部shutil.rmtree调用MSDN(http://msdn.microsoft.com/en-us/library/windows/desktop/aa363915%28v=vs.85%29.aspx)上记录的Windows API函数DeleteFile

此功能具有以下属性(由我提供):

  

DeleteFile函数在关闭时标记要删除的文件。 因此,在关闭文件的最后一个句柄之前不会删除文件。后续调用CreateFile以打开文件失败并显示ERROR_ACCESS_DENIED。

如果任何其他进程仍然打开句柄(例如病毒扫描程序,Windows资源管理器,因为您查看目录或其他任何可能仍然具有该目录句柄的内容),它将不会消失。

通常你只是在你的粘贴操作中捕获异常并重试几次/一些dozend毫秒,以处理所有那些奇怪的病毒扫描程序异常。

小小的奖励:您可以使用windbg或ProcessExplorer找出仍然保持文件打开句柄的人(只需在Process explorer中使用Find Handle并搜索文件名)。

相关问题