From c63c37fd192d0bae651e580ed8105875111ba3a6 Mon Sep 17 00:00:00 2001 From: Jaex Date: Mon, 18 May 2020 20:59:11 +0300 Subject: [PATCH] #702: Improvements to setting save integrity --- ShareX.HelpersLib/SettingsBase.cs | 17 ++++++++--------- ShareX.HistoryLib/HistoryManagerJSON.cs | 8 ++++---- ShareX.HistoryLib/HistoryManagerXML.cs | 4 ++-- 3 files changed, 14 insertions(+), 15 deletions(-) diff --git a/ShareX.HelpersLib/SettingsBase.cs b/ShareX.HelpersLib/SettingsBase.cs index 3b967c75d..9463084ef 100644 --- a/ShareX.HelpersLib/SettingsBase.cs +++ b/ShareX.HelpersLib/SettingsBase.cs @@ -144,7 +144,7 @@ private bool SaveInternal(string filePath) string tempFilePath = filePath + ".temp"; - using (FileStream fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.Read)) + using (FileStream fileStream = new FileStream(tempFilePath, FileMode.Create, FileAccess.Write, FileShare.Read, 4096, FileOptions.WriteThrough)) using (StreamWriter streamWriter = new StreamWriter(fileStream)) using (JsonTextWriter jsonWriter = new JsonTextWriter(streamWriter)) { @@ -162,17 +162,16 @@ private bool SaveInternal(string filePath) throw new Exception($"{typeName} file is corrupt: {tempFilePath}"); } - if (File.Exists(filePath)) - { - if (CreateBackup) - { - Helpers.CopyFile(filePath, BackupFolder); - } + string backupFilePath = null; - File.Delete(filePath); + if (CreateBackup) + { + string fileName = Path.GetFileName(filePath); + backupFilePath = Path.Combine(BackupFolder, fileName); + Helpers.CreateDirectoryFromDirectoryPath(BackupFolder); } - File.Move(tempFilePath, filePath); + File.Replace(tempFilePath, filePath, backupFilePath); if (CreateWeeklyBackup && !string.IsNullOrEmpty(BackupFolder)) { diff --git a/ShareX.HistoryLib/HistoryManagerJSON.cs b/ShareX.HistoryLib/HistoryManagerJSON.cs index c7d868b97..d461a31ee 100644 --- a/ShareX.HistoryLib/HistoryManagerJSON.cs +++ b/ShareX.HistoryLib/HistoryManagerJSON.cs @@ -68,13 +68,13 @@ protected override bool Append(string filePath, IEnumerable history { Helpers.CreateDirectoryFromFilePath(filePath); - using (FileStream fs = File.Open(filePath, FileMode.Append, FileAccess.Write, FileShare.Read)) - using (StreamWriter sw = new StreamWriter(fs)) + using (FileStream fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.WriteThrough)) + using (StreamWriter streamWriter = new StreamWriter(fileStream)) { JsonSerializer serializer = new JsonSerializer(); serializer.DefaultValueHandling = DefaultValueHandling.Ignore; - bool firstObject = fs.Length == 0; + bool firstObject = fileStream.Length == 0; foreach (HistoryItem historyItem in historyItems) { @@ -87,7 +87,7 @@ protected override bool Append(string filePath, IEnumerable history json += JObject.FromObject(historyItem, serializer).ToString(); - sw.Write(json); + streamWriter.Write(json); firstObject = false; } diff --git a/ShareX.HistoryLib/HistoryManagerXML.cs b/ShareX.HistoryLib/HistoryManagerXML.cs index 04d447808..99d7b232c 100644 --- a/ShareX.HistoryLib/HistoryManagerXML.cs +++ b/ShareX.HistoryLib/HistoryManagerXML.cs @@ -139,8 +139,8 @@ protected override bool Append(string filePath, IEnumerable history { Helpers.CreateDirectoryFromFilePath(filePath); - using (FileStream fs = File.Open(filePath, FileMode.Append, FileAccess.Write, FileShare.Read)) - using (XmlTextWriter writer = new XmlTextWriter(fs, Encoding.UTF8)) + using (FileStream fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.Read, 4096, FileOptions.WriteThrough)) + using (XmlTextWriter writer = new XmlTextWriter(fileStream, Encoding.UTF8)) { writer.Formatting = Formatting.Indented; writer.Indentation = 4;