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

标签 python windows shutil

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

当我打开目标文件夹窗口并且它是空的时,出现访问被拒绝异常,然后我被踢出文件夹并被删除。但是,如果它不为空,它就可以正常工作,没有异常(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/

相关文章:

python - 我的 Py_NoneStruct 符号(python、boost.python)在哪里?

python - 如何使用python将多个文件从子目录传输到单个路径文件夹?

python - 字节数组的用例

linux - Windows 文件命名问题

windows - 使用 SAPI 创建个人语音识别系统

python - 如何将文件文件夹移动到可变命名的文件夹

Python shutil.which 不适用于 wsl.exe

python - 调用 API 时 urllib2 出现 URL 错误

python - 如何在导入 python 模块时排除对象

python - 为什么我在这段代码中遇到语法错误?