首页 > 解决方案 > shutil.move 是否保证删除或抛出?

问题描述

https://docs.python.org/3/library/shutil.html#shutil.move

如果目标位于当前文件系统上,则使用 os.rename()。否则,使用 copy_function 将 src 复制到 dst 然后删除。

那么在这两种情况下,我是否可以确定如果函数没有抛出,源文件肯定不再可用?主机操作系统是否有不同的保证?

标签: pythonpython-3.xshutil

解决方案


的源代码shutil链接在文档的顶部。

通过分析来源:

  • 如果源和目标相同,重命名(“ # We might be on a case insensitive filesystem”)并返回
  • 如果源已经存在,则抛出
  • 尝试重命名(在一个文件系统内移动),如果成功返回
  • 如果失败,请尝试复制 - 它使用copy_function然后使用os.unlink删除原始文件(或者rmtree如果它是目录树 - 但它os.unlink也在其中使用)。此操作不在try阻塞中,因此任何异常都会传播。

好的,所以现在我们知道“删除”是由 完成的os.unlink,所以要分析它的行为,我们需要查看os.unlinkdocs ... 将我们重定向到os.removedocs。后者提供了有关特定于操作系统的行为和异常的更多信息:

在 Windows 上,尝试删除正在使用的文件会引发异常;在 Unix 上,目录条目被删除,但分配给文件的存储空间在原始文件不再使用之前不可用。


推荐阅读