жестких ссылок Использования 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
Да, за исключением того, что у меня нет доступа ко всем библиотекам, которые вызывают 'open()' внутренне и которые могут быть импортированы в любом порядке, поэтому решение должно быть более глобальным. – user124114
Я понимаю, что вы имеете в виду. изменилось на переопределение, затем перезагрузите все модули. – brice
@ user124114 Хорошо, это должно сделать трюк и быть довольно общим. – brice