From e5f5a2ab23ace19c6de39512f76f8fed5f5ad912 Mon Sep 17 00:00:00 2001 From: Guido Guenther Date: Thu, 23 Aug 2007 15:47:20 +0200 Subject: Imported upstream version 0.6.21 --- lib/SafeWriteFile.py | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100755 lib/SafeWriteFile.py (limited to 'lib/SafeWriteFile.py') diff --git a/lib/SafeWriteFile.py b/lib/SafeWriteFile.py new file mode 100755 index 0000000..1777d36 --- /dev/null +++ b/lib/SafeWriteFile.py @@ -0,0 +1,81 @@ +# SafeWriteFile.py +# +# This file is a writable file object. It writes to a specified newname, +# and when closed, renames the file to the realname. If the object is +# deleted, without being closed, this rename isn't done. If abort() is +# called, it also disables the rename. +# +# Copyright 2001 Adam Heath +# +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +from types import StringType +from shutil import copy2 +from string import find +from os import rename + +class ObjectNotAllowed(Exception): + pass + + +class InvalidMode(Exception): + pass + + +class SafeWriteFile: + def __init__(self, newname, realname, mode="w", bufsize=-1): + + if type(newname)!=StringType: + raise ObjectNotAllowed(newname) + if type(realname)!=StringType: + raise ObjectNotAllowed(realname) + + if find(mode, "r")>=0: + raise InvalidMode(mode) + if find(mode, "a")>=0 or find(mode, "+") >= 0: + copy2(realname, newname) + self.fobj=open(newname, mode, bufsize) + self.newname=newname + self.realname=realname + self.__abort=0 + + def close(self): + self.fobj.close() + if not (self.closed and self.__abort): + rename(self.newname, self.realname) + + def abort(self): + self.__abort=1 + + def __del__(self): + self.abort() + del self.fobj + + def __getattr__(self, attr): + try: + return self.__dict__[attr] + except: + return eval("self.fobj." + attr) + + +if __name__ == "__main__": + import time + f=SafeWriteFile("sf.new", "sf.data") + f.write("test\n") + f.flush() + time.sleep(1) + f.close() + +# vim:ts=4:sw=4:et: -- cgit v1.2.3