From da79178cc933f4d73d01de9aa6c97e65f687c7d0 Mon Sep 17 00:00:00 2001 From: Thomas Goyne Date: Sun, 21 Oct 2012 08:04:02 -0700 Subject: [PATCH] Add _tmp before the extension when saving This makes it easier to open the temporary file if an error occurs at some point in the saving process. --- aegisub/libaegisub/common/io.cpp | 19 ++++++++++++++++--- aegisub/libaegisub/include/libaegisub/io.h | 1 + 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/aegisub/libaegisub/common/io.cpp b/aegisub/libaegisub/common/io.cpp index 8d74258e6..112045749 100644 --- a/aegisub/libaegisub/common/io.cpp +++ b/aegisub/libaegisub/common/io.cpp @@ -30,6 +30,16 @@ #include "libaegisub/log.h" #include "libaegisub/util.h" +namespace { + std::string make_temp_name(std::string const& filename) { + std::string::size_type pos = filename.rfind('.'); + if (pos == std::string::npos) + return filename + "_tmp"; + + return filename.substr(0, pos) + "_tmp" + filename.substr(pos); + } +} + namespace agi { namespace io { @@ -53,7 +63,10 @@ std::ifstream* Open(const std::string &file, bool binary) { return stream; } -Save::Save(const std::string& file, bool binary): file_name(file) { +Save::Save(const std::string& file, bool binary) +: file_name(file) +, tmp_name(make_temp_name(file)) +{ LOG_D("agi/io/save/file") << file; const std::string pwd = util::DirName(file); @@ -68,12 +81,12 @@ Save::Save(const std::string& file, bool binary): file_name(file) { std::ofstream fp_touch(ConvertW(file).c_str()); } - fp = new std::ofstream(ConvertW(file + "_tmp").c_str(), binary ? std::ios::binary : std::ios::out); + fp = new std::ofstream(ConvertW(tmp_name).c_str(), binary ? std::ios::binary : std::ios::out); } Save::~Save() { delete fp; - util::Rename(file_name + "_tmp", file_name); + util::Rename(tmp_name, file_name); } std::ofstream& Save::Get() { diff --git a/aegisub/libaegisub/include/libaegisub/io.h b/aegisub/libaegisub/include/libaegisub/io.h index 9a7ed1957..bd363f2e4 100644 --- a/aegisub/libaegisub/include/libaegisub/io.h +++ b/aegisub/libaegisub/include/libaegisub/io.h @@ -36,6 +36,7 @@ std::ifstream* Open(const std::string &file, bool binary = false); class Save { std::ofstream *fp; const std::string file_name; + const std::string tmp_name; public: Save(const std::string& file, bool binary = false);