_orig_open = open

class _BkFile:
    def __init__(self, file, mode, bufsize):
        import os
        self.__filename = file
        self.__backup = file + '~'
        try:
            os.unlink(self.__backup)
        except os.error:
            pass
        try:
            os.rename(file, self.__backup)
        except os.error:
            self.__backup = None
        self.__file = _orig_open(file, mode, bufsize)
        self.closed = self.__file.closed
        self.fileno = self.__file.fileno
        self.flush = self.__file.flush
        self.isatty = self.__file.isatty
        self.mode = self.__file.mode
        self.name = self.__file.name
        self.read = self.__file.read
        self.readinto = self.__file.readinto
        self.readline = self.__file.readline
        self.readlines = self.__file.readlines
        self.seek = self.__file.seek
        self.softspace = self.__file.softspace
        self.tell = self.__file.tell
        self.truncate = self.__file.truncate
        self.write = self.__file.write
        self.writelines = self.__file.writelines

    def close(self):
        self.__file.close()
        if self.__backup is None:
            return
        import filecmp
        if filecmp.cmp(self.__backup, self.__filename, shallow = 0):
            import os
            os.unlink(self.__filename)
            os.rename(self.__backup, self.__filename)

def open(file, mode = 'r', bufsize = -1):
    if 'w' not in mode:
        return _orig_open(file, mode, bufsize)
    return _BkFile(file, mode, bufsize)
