From 7df8c52144da58fee038a30de147958a3ea2575e Mon Sep 17 00:00:00 2001 From: "Lin, Yong Xiang" Date: Sun, 25 Aug 2024 22:01:16 +0800 Subject: [PATCH] Save to temp to prevent file corruption --- source/creator/core/settings.d | 5 ++++- source/creator/io/inpexport.d | 6 +++++- source/creator/package.d | 7 +++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/source/creator/core/settings.d b/source/creator/core/settings.d index 217966de6..7a059830e 100644 --- a/source/creator/core/settings.d +++ b/source/creator/core/settings.d @@ -31,7 +31,10 @@ void incSettingsLoad() { Saves settings from settings store */ void incSettingsSave() { - write(incSettingsPath(), settings.toString()); + // using swp prevent file corruption + string swapPath = incSettingsPath() ~ ".swp"; + write(swapPath, settings.toString()); + rename(swapPath, incSettingsPath()); } /** diff --git a/source/creator/io/inpexport.d b/source/creator/io/inpexport.d index baeffe095..af64f1f66 100644 --- a/source/creator/io/inpexport.d +++ b/source/creator/io/inpexport.d @@ -6,6 +6,7 @@ import std.algorithm.sorting; import std.algorithm.mutation; import i18n; import std.exception; +import std.file : rename; private { vec2 mapUVCoord(vec2 value, vec2 min, vec2 max) { @@ -388,5 +389,8 @@ void incINPExport(Puppet puppet, IncINPExportSettings settings, string file) { incINPExportFlatten(source); incINPExportFinalizePacking(source, atlasses); - inWriteINPPuppet(source, file); + // using swp prevent file corruption + string swapPath = file ~ ".export.swp"; + inWriteINPPuppet(source, swapPath); + rename(swapPath, file); } \ No newline at end of file diff --git a/source/creator/package.d b/source/creator/package.d index f2dd4daf5..5af134d10 100644 --- a/source/creator/package.d +++ b/source/creator/package.d @@ -27,6 +27,7 @@ import creator.core.colorbleed; import std.path; import std.format; +import std.file : rename; import i18n; import std.algorithm.searching; import inochi2d.core.animation.player; @@ -284,8 +285,10 @@ void incSaveProject(string path, string autosaveStamp = "") { foreach (func; saveCallbacks) func(incActivePuppet()); - // Write the puppet to file - inWriteINPPuppet(incActivePuppet(), finalPath); + // Write the puppet to file, using swp prevent file corruption + string swapPath = finalPath ~ ".swp"; + inWriteINPPuppet(incActivePuppet(), swapPath); + rename(swapPath, finalPath); if (!isAutosave) incReleaseLockfile(); incActivePuppet().resetDrivers();