Просмотр исходного кода

Support for atomic file writes

Brad Robinson 8 лет назад
Родитель
Сommit
752594dfa3
1 измененных файлов с 36 добавлено и 0 удалено
  1. 36 0
      PetaJson.cs

+ 36 - 0
PetaJson.cs

@@ -86,6 +86,42 @@ namespace PetaJson
             writer.WriteValue(o);
         }
 
+        static void DeleteFile(string filename)
+        {
+            try
+            {
+                System.IO.File.Delete(filename);
+            }
+            catch
+            {
+                // Don't care
+            }
+        }
+
+        // Write a file atomically by writing to a temp file and then renaming it - prevents corrupted files if crash 
+        // in middle of writing file.
+        public static void WriteFileAtomic(string filename, object o, JsonOptions options = JsonOptions.None)
+        {
+            var tempName = filename + ".tmp";
+
+            try
+            {
+                // Write the temp file
+                WriteFile(tempName, o, options);
+
+                // Delete the original file
+                DeleteFile(filename);
+
+                // Rename the temp file
+                System.IO.File.Move(tempName, filename);
+            }
+            catch
+            {
+                DeleteFile(tempName);
+                throw;
+            }
+        }
+
         // Write an object to a file
         public static void WriteFile(string filename, object o, JsonOptions options = JsonOptions.None)
         {