我正在构建一个相对简单的应用程序,它询问目录,检查它们是否正确,然后删除其中一个并使用另一个内容重新创建它。我遇到了这种奇怪的行为,我会试着解释一下:
当我打开目标文件夹窗口时,它是空的,有一个访问被拒绝的异常,然后我被踢出文件夹并被删除。但是如果它不是空的,它可以正常工作,没有例外,目标目录(从它看起来)被清空然后填充源目录中的文件。这很奇怪,因为无论如何都应该直接删除目标文件夹,然后使用源目标中的相同名称和内容重新创建它。
这对我来说没有意义,当我浏览目录时它不是空的时候不应该有完全相同的异常吗?有什么区别,它仍然应该删除该文件夹。对此有任何合理的解释吗?另外,如果有异常,为什么目录会被删除呢?
此特定部分的代码非常简单(请记住我是初学者:))
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
答案 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并搜索文件名)。