|
import io |
|
import os |
|
import shutil |
|
import tempfile |
|
|
|
|
|
|
|
class TemporaryFileWriter(io.BufferedWriter): |
|
"""ใใกใคใซใใขใใใใฏใซๆดๆฐใใพใใ""" |
|
|
|
backup_filepath = None |
|
__filepath = None |
|
__temppath = None |
|
|
|
|
|
@property |
|
def filepath(self): |
|
"""ใใกใคใซใในใๅๅพใใพใใ""" |
|
return self.__filepath |
|
|
|
|
|
@property |
|
def temppath(self): |
|
"""ไธๆใใกใคใซใในใๅๅพใใพใใ""" |
|
return self.__temppath |
|
|
|
|
|
def __init__(self, filepath, mode='wb', buffer_size=io.DEFAULT_BUFFER_SIZE, backup_filepath=None): |
|
"""ใใกใคใซใในใๆๅฎใใฆๅๆๅใใพใใ |
|
backup_filepath ใซ None ไปฅๅคใๆๅฎใใใๅ ดๅใๆธใ่พผใฟๅฎไบๆใซ |
|
ใใใฏใขใใใใกใคใซใไฝๆใใใพใใ |
|
""" |
|
dirpath, filename = os.path.split(filepath) |
|
fd, temppath = tempfile.mkstemp(prefix=filename + '.', dir=dirpath) |
|
try: |
|
fh = os.fdopen(fd, mode) |
|
super(TemporaryFileWriter, self).__init__(fh, buffer_size) |
|
except: |
|
if fh: |
|
fh.close() |
|
os.remove(temppath) |
|
raise |
|
self.__filepath = filepath |
|
self.__temppath = temppath |
|
self.backup_filepath = backup_filepath |
|
|
|
|
|
def __enter__(self): |
|
return self |
|
|
|
|
|
def __exit__(self, exc_type, exc_value, traceback): |
|
if exc_type is None and exc_value is None and traceback is None: |
|
self.close() |
|
else: |
|
self.abort() |
|
|
|
|
|
def close(self): |
|
"""ไธๆใใกใคใซใ้ใใฆใชใใผใ ใใพใใ""" |
|
if self.closed: |
|
return |
|
super(io.BufferedWriter, self).close() |
|
self.raw.close() |
|
try: |
|
if os.path.exists(self.filepath): |
|
if self.backup_filepath is not None: |
|
shutil.move(self.filepath, self.backup_filepath) |
|
else: |
|
os.remove(self.filepath) |
|
shutil.move(self.temppath, self.filepath) |
|
except: |
|
os.remove(self.temppath) |
|
raise |
|
|
|
|
|
def abort(self): |
|
"""ไธๆใใกใคใซใ้ใใฆๅ้คใใพใใ""" |
|
if self.closed: |
|
return |
|
super(io.BufferedWriter, self).close() |
|
self.raw.close() |
|
os.remove(self.temppath) |
|
|