Python硬链接实现写时复制

5

使用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
1个回答

2

你是在寻找类似这样的东西吗?

import sys
old_open = __builtins__.open    

# Override builtin open()
def my_open(fname, *args, **kwargs):
    # If the path is a hardlink, (ie, check that st_nlink >1)
    if os.path.isfile(fname) and os.stat(fname).st_nlink > 1: 
        os.unlink(fname)
    return old_open(fname, *args, **kwargs)
__buitlins__.open = my_open

是的,除非我无法访问所有内部调用open()的库,并且这些库可以以任何顺序导入,因此解决方案需要更全局化。 - user124114
我明白你的意思。将“changed to override open”修改为“override open”,然后重新加载所有模块。 - brice
@user124114 好的,那应该可以解决问题并且比较通用。 - brice
2
__builtin__ 模块在整个进程中是全局共享的,我认为重新加载不是必要的。无论如何,这是我目前拥有的解决方案(请参见最后一句话):-) 我想知道是否还有其他更聪明的方法 - 覆盖内置函数有点恶心。 - user124114
增加 if 'w' in mode and not '+' in mode ? - kxr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接