2012-03-29 2 views
4

жестких ссылок Использования Python 2.5+, UNIX:Python копирования при записи с помощью

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

Но с помощью hardlinks это означает, что используется тот же inode (только усеченный), поэтому исходное содержимое также уничтожается. Для копирования-на-записи я, конечно, хочу, чтобы оригинал оставался нетронутым (старый индекс) и вызов 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

Были ли вы ищете что-то вроде этого?

+0

Да, за исключением того, что у меня нет доступа ко всем библиотекам, которые вызывают 'open()' внутренне и которые могут быть импортированы в любом порядке, поэтому решение должно быть более глобальным. – user124114

+0

Я понимаю, что вы имеете в виду. изменилось на переопределение, затем перезагрузите все модули. – brice

+0

@ user124114 Хорошо, это должно сделать трюк и быть довольно общим. – brice

Смежные вопросы