def write(self, file_content): """Writes string file contents to file, clearing contents of the file on first write and then appending on subsequent calls. Args: file_content: string, the contents """ if not self.write_mode: raise errors.PermissionDeniedError( None, None, "File not opened in write mode" ) if self.closed: raise errors.FailedPreconditionError( None, None, "File already closed" ) if self.fs_supports_append: if not self.write_started: # write the first chunk to truncate file if it already exists self.fs.write(self.filename, file_content, self.binary_mode) self.write_started = True else: # append the later chunks self.fs.append(self.filename, file_content, self.binary_mode) else: # add to temp file, but wait for flush to write to final filesystem if self.write_temp is None: mode = "w+b" if self.binary_mode else "w+" self.write_temp = tempfile.TemporaryFile(mode) compatify = compat.as_bytes if self.binary_mode else compat.as_text self.write_temp.write(compatify(file_content))
def flush(self): if self.closed: raise errors.FailedPreconditionError(None, None, "File already closed") if not self.fs_supports_append: if self.write_temp is not None: # read temp file from the beginning self.write_temp.flush() self.write_temp.seek(0) chunk = self.write_temp.read() if chunk is not None: # write full contents and keep in temp file self.fs.write(self.filename, chunk, self.binary_mode) self.write_temp.seek(len(chunk))