Использование 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