![]() |
1
16
如果您看到Python的文档,它会清楚地提到os.rename()是一个原子操作。因此,在您的情况下,将数据写入临时文件,然后将其重命名为原始文件是非常安全的。
如您所见,您随身携带了abc.xml.bak,如果tmp文件存在任何相关问题,您可以使用它进行恢复并将其复制回来。 |
![]() |
2
13
如果您想准确无误地进行保存,您必须:
请注意,调用fsync会对性能产生不可预测的影响——因此,ext3上的Linux可能会暂停磁盘I/O整秒,这取决于其他未完成的I/O。
注意
然而,问题是,即使不是所有的文件系统,也是大多数文件系统将元数据和数据分开。重命名只是元数据。这听起来可能很可怕,但文件系统重视元数据而不是数据(以HFS+或Ext3,4中的日志记录为例)!原因是元数据较轻,如果元数据已损坏,则整个文件系统都已损坏——文件系统当然必须保存它自己,然后按顺序保存用户的数据。
Ext4确实打破了规则
|
![]() |
3
5
在WinAPI中,我发现了非常好的函数 ReplaceFile DeleteFile , MoveFile 联合体。
|
![]() |
4
5
一个过于简单的解决方案。使用
注意
有关锁定文件的信息,请参见 portalocker |
![]() |
5
4
标准溶液是这个。
任何时候都不会有任何损失或腐败。唯一的故障可能发生在重命名过程中。但你没有丢失或损坏任何东西。原始文件在最终重命名之前可以恢复。 |
![]() |
6
3
现在有了一个编码的、纯Python,我敢说,在 boltons utility library : boltons.fileutils.atomic_save .
只是
all well-documented . 完全公开,我是《博尔顿》的作者,但这一部分是在大量社区帮助下建立的。不要犹豫 drop a note 如果有不清楚的地方! |
![]() |
7
2
然后我用这个脚本测试了这个行为。
虽然这只适用于Windows,但它似乎有许多其他替换例程所缺乏的优秀功能。见 API docs |
![]() |
8
0
您可以使用fileinput模块为您处理备份和就地写入:
如果你在写新行之前需要阅读全部内容,
如果脚本突然结束,您仍将拥有备份。 |
![]() |
PHPLover · “支持PHP扩展或功能的端口”实际上是什么意思? 10 月前 |