使用硬链接进行Python copy-on-write

时间:2012-03-29 11:59:03

标签: python unix hardlink

使用Python 2.5 +,UNIX:

我有一个程序,通过硬链接所有条目来模拟目录“写时复制”功能。目前,所有底层代码(其中一些我无法访问)使用标准open(fname, 'w')来编写常规文件。

但是使用硬链接,这意味着使用相同的inode(只是截断),因此原始内容也会被销毁。对于copy-on-write,我当然希望原始文件保持不变(旧的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 个答案:

答案 0 :(得分:1)

你在找这样的东西吗?

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