gpt4 book ai didi

python - 谁能解释 shutil.rmtree 和 shutil.copytree 的这种奇怪行为?

转载 作者:可可西里 更新时间:2023-11-01 09:33:38 31 4
gpt4 key购买 nike

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

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

这对我来说没有意义,当我浏览目录时,当目录不为空时,不应该出现与目录为空时完全相同的异常吗?有什么区别,它仍然应该只是删除文件夹。对此有什么合乎逻辑的解释吗?另外,如果有异常,为什么目录还是被删除了?

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

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

最佳答案

这是 Windows 上的预期行为。

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

此函数具有以下属性(由我突出显示):

The DeleteFile function marks a file for deletion on close. Therefore, the file deletion does not occur until the last handle to the file is closed. Subsequent calls to CreateFile to open the file fail with ERROR_ACCESS_DENIED.

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

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

一点好处:您可以使用 windbg 或 ProcessExplorer 来找出谁仍然保留着您的文件的打开句柄(只需在 Process Explorer 中使用 Find Handle 并搜索文件名)。

关于python - 谁能解释 shutil.rmtree 和 shutil.copytree 的这种奇怪行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27625683/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com