public bool ResetToDefault() { // Clear original data. Items.Clear(); SettingsData <T> data = null; var assemblies = new List <Assembly>(); var exasm = Assembly.GetExecutingAssembly(); var enasm = Assembly.GetEntryAssembly(); assemblies.Add(exasm); if (exasm != enasm) { assemblies.Add(enasm); } var success = false; for (int a = 0; a < assemblies.Count; a++) { var assembly = assemblies[a]; var names = assembly.GetManifestResourceNames(); // Get compressed resource name. var name = names.FirstOrDefault(x => x.EndsWith(_XmlFile.Name + ".gz")); if (string.IsNullOrEmpty(name)) { // Get uncompressed resource name. name = names.FirstOrDefault(x => x.EndsWith(_XmlFile.Name)); } // If internal preset was found. if (!string.IsNullOrEmpty(name)) { var resource = assembly.GetManifestResourceStream(name); var sr = new StreamReader(resource); byte[] bytes; using (var memstream = new MemoryStream()) { sr.BaseStream.CopyTo(memstream); bytes = memstream.ToArray(); } if (name.EndsWith(".gz")) { bytes = SettingsHelper.Decompress(bytes); } var xml = Encoding.UTF8.GetString(bytes); data = Serializer.DeserializeFromXmlString <SettingsData <T> >(xml); success = true; break; } } LoadAndValidateData(data == null ? null : data.Items); return(success); }
public void LoadFrom(string fileName) { var settingsLoaded = false; var fi = new FileInfo(fileName); // If configuration file exists then... if (fi.Exists) { SettingsData <T> data = null; // Try to read file until success. while (true) { // Deserialize and load data. lock (saveReadFileLock) { try { var bytes = File.ReadAllBytes(fi.FullName); data = DeserializeData(bytes, fi.Name.EndsWith(".gz")); break; } catch (Exception ex) { var backupFile = fi.FullName + ".bak"; var sb = new StringBuilder(); sb.AppendFormat("{0} file has become corrupted.\r\n\r\n" + "Reason: " + ex.Message + "\r\n\r\n" + "Program must reset {0} file in order to continue.\r\n\r\n" + " Click [Yes] to reset and continue.\r\n" + " Click [No] if you wish to attempt manual repair.\r\n\r\n" + " File: {1}", fi.Name, fi.FullName); sb.AppendLine(); sb.Append('-', 64); sb.AppendLine(); sb.AppendLine(ex.ToString()); var caption = string.Format("Corrupt {0} of {1}", fi.Name, Application.ProductName); //var form = new MessageBox(); //form.StartPosition = FormStartPosition.CenterParent; var text = sb.ToString(); var result = MessageBox.Show(text, caption, MessageBoxButtons.YesNo, MessageBoxIcon.Error); if (result == DialogResult.Yes) { if (File.Exists(backupFile)) { File.Copy(backupFile, fi.FullName, true); fi.Refresh(); } else { File.Delete(fi.FullName); break; } } else { // Avoid the inevitable crash by killing application first. Process.GetCurrentProcess().Kill(); return; } } } } // If data read was successful then... if (data != null) { // Reorder data of order method exists. var ao = ApplyOrder; if (ao != null) { ao(data); } LoadAndValidateData(data.Items); settingsLoaded = true; } } // If settings failed to load then... if (!settingsLoaded) { ResetToDefault(); Save(); } }