Write data to a temporary file and when data has been successfully written, rename the file to the correct destination file e.g
f = open(tmpFile, 'w')
f.write(text)
# make sure that all data is on disk
# see http://stackoverflow.com/questions/7433057/is-rename-without-fsync-safe
f.flush()
os.fsync(f.fileno())
f.close()
os.rename(tmpFile, myFile)
According to doc http://docs.python.org/library/os.html#os.rename
If successful, the renaming will be an atomic operation (this is a
POSIX requirement). On Windows, if dst
already exists, OSError will be raised
even if it is a file; there may be no
way to implement an atomic rename when
dst names an existing file
also
The operation may fail on some Unix flavors if src and dst are on different filesystems.
Note:
It may not be atomic operation if src and dest locations are not on same filesystem
os.fsync
step may be skipped if performance/responsiveness is more important than the data integrity in cases like power failure, system crash etc
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…