Python копирование при записи с использованием жестких ссылок - PullRequest
4 голосов
/ 29 марта 2012

Использование Python 2.5+, UNIX:

У меня есть программа, которая имитирует функциональность каталога "копировать при записи", связывая все записи.В настоящее время весь базовый код, к некоторым из которых у меня нет доступа, использует стандартные open(fname, 'w') для записи обычных файлов.

Но с жесткими ссылками это означает, что используется тот же индекс (только усеченный),поэтому оригинальное содержание также уничтожается.Для копирования при записи я бы, конечно, хотел, чтобы оригинал остался нетронутым (старый инод) и вызов open('w') для создания нового инода.

Есть какие-нибудь идеи о наилучшем способе достижения этого?Monkey-patch 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 Ответ

1 голос
/ 29 марта 2012

Вы искали что-то подобное?

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
...