【问题标题】:Is shutil.move guaranteed to either delete or throw?shutil.move 是否保证删除或抛出?
【发布时间】:2020-03-18 08:04:46
【问题描述】:

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

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

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

【问题讨论】:

    标签: python python-3.x shutil


    【解决方案1】:

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

    通过分析来源:

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

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

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

    【讨论】:

    • 感谢您的广泛分析 (+1),我认为我可以安全地假设并将继续该假设。但是,我不确定是否将实施作为保证,因为他们可能会在未来的版本中更改它。
    • 嗯,它是 Python 标准库。如果有的话,它是应该遵循 Python 之禅的少数几件事之一——包括“错误永远不应该默默地传递。/除非明确地沉默。” +“如果实现很容易解释,那可能是个好主意”,所以我认为他们不会更改 shutil 中的那个函数,因为它可以工作并且可读。 ;) 如果有的话,os 模块或其内部可能会发生一些特定于操作系统和特定于实现的事情。
    猜你喜欢
    • 2013-08-09
    • 2019-08-14
    • 2011-04-19
    • 1970-01-01
    • 2013-09-03
    • 2012-02-04
    • 2013-08-01
    • 2014-05-29
    • 2022-10-07
    相关资源
    最近更新 更多