diff --git a/Configuration/SystemConfig.cs b/Configuration/SystemConfig.cs
index 6e57f9a1..13e7998f 100644
--- a/Configuration/SystemConfig.cs
+++ b/Configuration/SystemConfig.cs
@@ -1,6 +1,5 @@
 using System;
 using System.IO;
-using TweetDuck.Core.Utils;
 using TweetDuck.Data.Serialization;
 
 namespace TweetDuck.Configuration{
@@ -34,7 +33,6 @@ private SystemConfig(string file){
 
         public bool Save(){
             try{
-                WindowsUtils.CreateDirectoryForFile(file);
                 Serializer.Write(file, this);
                 return true;
             }catch(Exception e){
@@ -47,9 +45,7 @@ public static SystemConfig Load(string file){
             SystemConfig config = new SystemConfig(file);
             
             try{
-                Serializer.Read(file, config);
-            }catch(FileNotFoundException){
-            }catch(DirectoryNotFoundException){
+                Serializer.ReadIfExists(file, config);
             }catch(Exception e){
                 Program.Reporter.HandleException("Configuration Error", "Could not open the system configuration file. If you continue, you will lose system specific configuration such as Hardware Acceleration.", true, e);
             }
diff --git a/Configuration/UserConfig.cs b/Configuration/UserConfig.cs
index 742096ff..06bdec1a 100644
--- a/Configuration/UserConfig.cs
+++ b/Configuration/UserConfig.cs
@@ -142,8 +142,6 @@ private UserConfig(string file){
 
         public bool Save(){
             try{
-                WindowsUtils.CreateDirectoryForFile(file);
-
                 if (File.Exists(file)){
                     string backupFile = GetBackupFile(file);
                     File.Delete(backupFile);
diff --git a/Core/Other/Analytics/AnalyticsFile.cs b/Core/Other/Analytics/AnalyticsFile.cs
index 3730b41d..c9cf7f74 100644
--- a/Core/Other/Analytics/AnalyticsFile.cs
+++ b/Core/Other/Analytics/AnalyticsFile.cs
@@ -1,6 +1,4 @@
 using System;
-using System.IO;
-using TweetDuck.Core.Utils;
 using TweetDuck.Data.Serialization;
 
 namespace TweetDuck.Core.Other.Analytics{
@@ -30,7 +28,6 @@ private AnalyticsFile(string file){
 
         public bool Save(){
             try{
-                WindowsUtils.CreateDirectoryForFile(file);
                 Serializer.Write(file, this);
                 return true;
             }catch(Exception e){
@@ -43,9 +40,7 @@ public static AnalyticsFile Load(string file){
             AnalyticsFile config = new AnalyticsFile(file);
             
             try{
-                Serializer.Read(file, config);
-            }catch(FileNotFoundException){
-            }catch(DirectoryNotFoundException){
+                Serializer.ReadIfExists(file, config);
             }catch(Exception e){
                 Program.Reporter.HandleException("Analytics File Error", "Could not open the analytics file.", true, e);
             }
diff --git a/Data/Serialization/FileSerializer.cs b/Data/Serialization/FileSerializer.cs
index 6536af94..ee1dd560 100644
--- a/Data/Serialization/FileSerializer.cs
+++ b/Data/Serialization/FileSerializer.cs
@@ -4,6 +4,7 @@
 using System.Linq;
 using System.Reflection;
 using System.Runtime.Serialization;
+using TweetDuck.Core.Utils;
 
 namespace TweetDuck.Data.Serialization{
     sealed class FileSerializer<T>{
@@ -28,6 +29,8 @@ public void RegisterTypeConverter(Type type, ITypeConverter converter){
         }
 
         public void Write(string file, T obj){
+            WindowsUtils.CreateDirectoryForFile(file);
+
             using(StreamWriter writer = new StreamWriter(new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))){
                 foreach(KeyValuePair<string, PropertyInfo> prop in props){
                     Type type = prop.Value.PropertyType;
@@ -54,8 +57,12 @@ public void Read(string file, T obj){
             Dictionary<string, string> unknownProperties = new Dictionary<string, string>(4);
 
             using(StreamReader reader = new StreamReader(new FileStream(file, FileMode.Open, FileAccess.Read, FileShare.Read))){
-                if (reader.Peek() <= 1){
-                    throw new FormatException("Input appears to be a binary file.");
+                switch(reader.Peek()){
+                    case -1:
+                        throw new FormatException("File is empty.");
+                    case 0:
+                    case 1:
+                        throw new FormatException("Input appears to be a binary file.");
                 }
 
                 foreach(string line in reader.ReadToEnd().Split(new string[]{ NewLineReal }, StringSplitOptions.RemoveEmptyEntries)){
@@ -95,6 +102,13 @@ public void Read(string file, T obj){
             }
         }
 
+        public void ReadIfExists(string file, T obj){
+            try{
+                Read(file, obj);
+            }catch(FileNotFoundException){
+            }catch(DirectoryNotFoundException){}
+        }
+
         private sealed class BasicTypeConverter : ITypeConverter{
             bool ITypeConverter.TryWriteType(Type type, object value, out string converted){
                 switch(Type.GetTypeCode(type)){