python - shutil.move 是否保证删除或抛出?
问题描述
https://docs.python.org/3/library/shutil.html#shutil.move说
如果目标位于当前文件系统上,则使用 os.rename()。否则,使用 copy_function 将 src 复制到 dst 然后删除。
那么在这两种情况下,我是否可以确定如果函数没有抛出,源文件肯定不再可用?主机操作系统是否有不同的保证?
解决方案
的源代码shutil
链接在文档的顶部。
通过分析来源:
- 如果源和目标相同,重命名(“
# We might be on a case insensitive filesystem
”)并返回 - 如果源已经存在,则抛出
- 尝试重命名(在一个文件系统内移动),如果成功返回
- 如果失败,请尝试复制 - 它使用
copy_function
然后使用os.unlink
删除原始文件(或者rmtree
如果它是目录树 - 但它os.unlink
也在其中使用)。此操作不在try
阻塞中,因此任何异常都会传播。
好的,所以现在我们知道“删除”是由 完成的os.unlink
,所以要分析它的行为,我们需要查看os.unlink
docs ... 将我们重定向到os.remove
docs。后者提供了有关特定于操作系统的行为和异常的更多信息:
在 Windows 上,尝试删除正在使用的文件会引发异常;在 Unix 上,目录条目被删除,但分配给文件的存储空间在原始文件不再使用之前不可用。
推荐阅读
- neo4j - (Neo4j) 查询不显示图表
- javascript - UWP - 将 png 保存为 jpg,我希望透明度变为白色
- javascript - React 添加购物车重构 - 未知添加状态
- cassandra - 使用 kafka connect cassandra sink 在 Cassandra 中自动生成表
- python - 使用聚合时 MongoDB 缓存或内存泄漏
- c# - 如何在 Angular 中使用 typescript 根据下拉值显示名称值?
- javascript - 在 Node / Electron 环境中共享 ESM“.js”模块
- angular - 将特定表单添加到 *ngFor 中的项目
- c# - 每次程序向文件 C# 输入新字符串时,编写新的代码行
- graph - 如何在图表中包含“引用”属性/属性?