使用Python 2.5+,UNIX:
我有一个程序,模拟目录的“写时复制”功能,通过硬链接所有条目。目前,所有基础代码(其中一些我无法访问)都使用标准的open(fname, 'w')
来写入常规文件。
但是对于硬链接,这意味着使用相同的inode(仅截断),因此原始内容也被破坏了。对于写时复制,我当然希望原始内容保持不变(旧的inode),并且open('w')
调用创建一个新的inode。
有什么好方法可以实现这一点吗?以某种方式猴子补丁open
?
到目前为止,我想出的方法是覆盖open
,尝试首先删除文件(如果存在),然后再执行open('w')
:
import __builtin__
_open = __builtin__.open
def my_open(name, mode='r', *args, **kwargs):
"""Simulate copy-on-write, by deleting the file first if it exists"""
if 'w' in mode and os.path.exists(name): # TODO: use isfile()?
os.remove(name)
return _open(name, mode, *args, **kwargs)
__builtin__.open = my_open
open()
的库,并且这些库可以以任何顺序导入,因此解决方案需要更全局化。 - user124114__builtin__
模块在整个进程中是全局共享的,我认为重新加载不是必要的。无论如何,这是我目前拥有的解决方案(请参见最后一句话):-) 我想知道是否还有其他更聪明的方法 - 覆盖内置函数有点恶心。 - user124114if 'w' in mode and not '+' in mode
? - kxr