diff --git a/src/filesys.cpp b/src/filesys.cpp index 5fdc97634..501f9ad6c 100644 --- a/src/filesys.cpp +++ b/src/filesys.cpp @@ -693,13 +693,22 @@ bool safeWriteToFile(const std::string &path, const std::string &content) os.flush(); os.close(); if (os.fail()) { + // Remove the temporary file because writing it failed and it's useless. remove(tmp_file.c_str()); return false; } - // Copy file + // Move the finished temporary file over the real file +#ifdef _WIN32 + // On POSIX compliant systems rename() is specified to be able to swap the + // file in place of the destination file, making this a truly error-proof + // transaction. + // However, on Windows, the target file has to be removed first. remove(path.c_str()); +#endif if(rename(tmp_file.c_str(), path.c_str())) { + // Remove the temporary file because moving it over the target file + // failed. remove(tmp_file.c_str()); return false; } else {