CM3D2 Converter.fileutil

 1import io
 2import os
 3import shutil
 4import tempfile
 5
 6
 7class TemporaryFileWriter(io.BufferedWriter):
 8    """ファイルをアトミックに更新します。"""
 9    backup_filepath = None
10    __filepath = None
11    __temppath = None
12
13    @property
14    def filepath(self):
15        """ファイルパスを取得します。"""
16        return self.__filepath
17
18    @property
19    def temppath(self):
20        """一時ファイルパスを取得します。"""
21        return self.__temppath
22
23    def __init__(self, filepath, mode='wb', buffer_size=io.DEFAULT_BUFFER_SIZE, backup_filepath=None):
24        """ファイルパスを指定して初期化します。
25        backup_filepath に None 以外が指定された場合、書き込み完了時に
26        バックアップファイルが作成されます。
27        """
28        dirpath, filename = os.path.split(filepath)
29        fd, temppath = tempfile.mkstemp(prefix=filename + '.', dir=dirpath)
30        try:
31            fh = os.fdopen(fd, mode)
32            super(TemporaryFileWriter, self).__init__(fh, buffer_size)
33        except:
34            if fh:
35                fh.close()
36            os.remove(temppath)
37            raise
38        self.__filepath = filepath
39        self.__temppath = temppath
40        self.backup_filepath = backup_filepath
41
42    def __enter__(self):
43        return self
44
45    def __exit__(self, exc_type, exc_value, traceback):
46        if exc_type is None and exc_value is None and traceback is None:
47            self.close()
48        else:
49            self.abort()
50
51    def close(self):
52        """一時ファイルを閉じてリネームします。"""
53        if self.closed:
54            return
55        super(io.BufferedWriter, self).close()
56        self.raw.close()
57        try:
58            if os.path.exists(self.filepath):
59                if self.backup_filepath is not None:
60                    shutil.move(self.filepath, self.backup_filepath)
61                else:
62                    os.remove(self.filepath)
63            shutil.move(self.temppath, self.filepath)
64        except:
65            os.remove(self.temppath)
66            raise
67
68    def abort(self):
69        """一時ファイルを閉じて削除します。"""
70        if self.closed:
71            return
72        super(io.BufferedWriter, self).close()
73        self.raw.close()
74        os.remove(self.temppath)
class TemporaryFileWriter(_io.BufferedWriter):
 8class TemporaryFileWriter(io.BufferedWriter):
 9    """ファイルをアトミックに更新します。"""
10    backup_filepath = None
11    __filepath = None
12    __temppath = None
13
14    @property
15    def filepath(self):
16        """ファイルパスを取得します。"""
17        return self.__filepath
18
19    @property
20    def temppath(self):
21        """一時ファイルパスを取得します。"""
22        return self.__temppath
23
24    def __init__(self, filepath, mode='wb', buffer_size=io.DEFAULT_BUFFER_SIZE, backup_filepath=None):
25        """ファイルパスを指定して初期化します。
26        backup_filepath に None 以外が指定された場合、書き込み完了時に
27        バックアップファイルが作成されます。
28        """
29        dirpath, filename = os.path.split(filepath)
30        fd, temppath = tempfile.mkstemp(prefix=filename + '.', dir=dirpath)
31        try:
32            fh = os.fdopen(fd, mode)
33            super(TemporaryFileWriter, self).__init__(fh, buffer_size)
34        except:
35            if fh:
36                fh.close()
37            os.remove(temppath)
38            raise
39        self.__filepath = filepath
40        self.__temppath = temppath
41        self.backup_filepath = backup_filepath
42
43    def __enter__(self):
44        return self
45
46    def __exit__(self, exc_type, exc_value, traceback):
47        if exc_type is None and exc_value is None and traceback is None:
48            self.close()
49        else:
50            self.abort()
51
52    def close(self):
53        """一時ファイルを閉じてリネームします。"""
54        if self.closed:
55            return
56        super(io.BufferedWriter, self).close()
57        self.raw.close()
58        try:
59            if os.path.exists(self.filepath):
60                if self.backup_filepath is not None:
61                    shutil.move(self.filepath, self.backup_filepath)
62                else:
63                    os.remove(self.filepath)
64            shutil.move(self.temppath, self.filepath)
65        except:
66            os.remove(self.temppath)
67            raise
68
69    def abort(self):
70        """一時ファイルを閉じて削除します。"""
71        if self.closed:
72            return
73        super(io.BufferedWriter, self).close()
74        self.raw.close()
75        os.remove(self.temppath)

ファイルをアトミックに更新します。

TemporaryFileWriter(filepath, mode='wb', buffer_size=8192, backup_filepath=None)
24    def __init__(self, filepath, mode='wb', buffer_size=io.DEFAULT_BUFFER_SIZE, backup_filepath=None):
25        """ファイルパスを指定して初期化します。
26        backup_filepath に None 以外が指定された場合、書き込み完了時に
27        バックアップファイルが作成されます。
28        """
29        dirpath, filename = os.path.split(filepath)
30        fd, temppath = tempfile.mkstemp(prefix=filename + '.', dir=dirpath)
31        try:
32            fh = os.fdopen(fd, mode)
33            super(TemporaryFileWriter, self).__init__(fh, buffer_size)
34        except:
35            if fh:
36                fh.close()
37            os.remove(temppath)
38            raise
39        self.__filepath = filepath
40        self.__temppath = temppath
41        self.backup_filepath = backup_filepath

ファイルパスを指定して初期化します。 backup_filepath に None 以外が指定された場合、書き込み完了時に バックアップファイルが作成されます。

backup_filepath = None
filepath

ファイルパスを取得します。

temppath

一時ファイルパスを取得します。

def close(self):
52    def close(self):
53        """一時ファイルを閉じてリネームします。"""
54        if self.closed:
55            return
56        super(io.BufferedWriter, self).close()
57        self.raw.close()
58        try:
59            if os.path.exists(self.filepath):
60                if self.backup_filepath is not None:
61                    shutil.move(self.filepath, self.backup_filepath)
62                else:
63                    os.remove(self.filepath)
64            shutil.move(self.temppath, self.filepath)
65        except:
66            os.remove(self.temppath)
67            raise

一時ファイルを閉じてリネームします。

def abort(self):
69    def abort(self):
70        """一時ファイルを閉じて削除します。"""
71        if self.closed:
72            return
73        super(io.BufferedWriter, self).close()
74        self.raw.close()
75        os.remove(self.temppath)

一時ファイルを閉じて削除します。

Inherited Members
_io.BufferedWriter
detach
seekable
writable
fileno
isatty
write
truncate
flush
seek
tell
raw
closed
name
mode
_io._BufferedIOBase
read
read1
readinto
readinto1
_io._IOBase
readable
readline
readlines
writelines