kitou's picture
Upload 646 files
4d3af08
raw
history blame
2.36 kB
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)