/// <summary> /// Save an object to ini file /// </summary> /// <param name="o">object to save</param> /// <param name="section">[Section] to save to</param> /// <param name="propertynames">array of properties to save</param> /// <param name="file">ini file name</param> public static void Save(object o, string section, string[] propertynames, string file, bool makebackupfile) { lock (sm_locker) { FileInfo fi = new FileInfo(file); if (fi.Exists) { FileAttributes fattr = File.GetAttributes(file); fattr &= ~FileAttributes.ReadOnly; File.SetAttributes(file, fattr); } if (Directory.Exists(Path.GetDirectoryName(file)) == false) { Directory.CreateDirectory(Path.GetDirectoryName(file)); } //get a temp file using (TempFileCollection tempfiles = new TempFileCollection(fi.DirectoryName, false)) { string tempfile = tempfiles.AddExtension(fi.Extension, false); if (fi.Exists) { File.Copy(file, tempfile); FileAttributes tattr = File.GetAttributes(tempfile); tattr &= ~FileAttributes.ReadOnly; File.SetAttributes(tempfile, tattr); } Type t = o.GetType(); ArrayList pis = new ArrayList(); foreach (string s in propertynames) { PropertyInfo propinfo = t.GetProperty(s); if (propinfo != null) { pis.Add(propinfo); } } Dictionary <string, string> existingEntries = GetIniSectionDictionary(section, file); foreach (PropertyInfo pi in pis) { bool hassetandget = pi.CanRead & pi.CanWrite; //if (hassetandget) { object v = pi.GetValue(o, null); string key = pi.Name; string inival = StringConverter.ConvertToString(v);//v.ToString(); string defval = ""; DefaultValueAttribute[] defvalfields = (DefaultValueAttribute[])pi.GetCustomAttributes(typeof(DefaultValueAttribute), true); if (defvalfields.Length > 0) { if (defvalfields[0].Value != null) { defval = StringConverter.ConvertToString(defvalfields[0].Value); } } string curinival = GetIniSectionValuefromDictionary(existingEntries, key, defval);//Ini.sGetPrivateProfileString(section, key, tempfile, defval); if ((curinival != inival) || SaveDefaultValues) { Ini.WritePrivateProfileString(section, key, inival, tempfile); } } } DateTime now = DateTime.Now; string datesuffix = string.Format("{0:00}{1:00}{2:00}{3:00}{4:00}", now.Month, now.Day, now.Year, now.Hour, now.Minute); //make a backup of the original file string backupfile = Path.Combine(BackupFolder.Path, Path.GetFileName(file) + ".BACKUP" + datesuffix); if (fi.Exists) { // check for read only flag, remove it if needed if (makebackupfile) { if (File.Exists(backupfile)) { FileAttributes attr = File.GetAttributes(backupfile); attr &= ~FileAttributes.ReadOnly; File.SetAttributes(backupfile, attr); } File.Copy(file, backupfile, true); File.SetAttributes(backupfile, FileAttributes.ReadOnly); } fi.Delete(); } //if we got here, then we should be OK if (File.Exists(tempfile)) { File.Move(tempfile, file); } tempfiles.Delete(); } } }
/// <summary> /// Save an object to ini file, except for the properties marked with the DontSerializeAttribute. /// </summary> /// <param name="o">object to save</param> /// <param name="section">[Section] to save to</param> /// <param name="file">ini file name</param> /// <param name="makebackupfile">makes a backup file</param> public static void Save(object o, string section, string file, bool makebackupfile) { lock (sm_locker) { if (Directory.Exists(Path.GetDirectoryName(file)) == false) { try { Directory.CreateDirectory(Path.GetDirectoryName(file)); } catch (Exception ex) { throw new ApplicationException(string.Format("Unable to create directory '{0}'.", Path.GetDirectoryName(file)), ex); } } bool changesToIni = false; FileInfo fi = new FileInfo(file); if (fi.Exists) { FileAttributes fattr = File.GetAttributes(file); if ((fattr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { fattr &= ~FileAttributes.ReadOnly; File.SetAttributes(file, fattr); } } //get a temp file using (TempFileCollection tempfiles = new TempFileCollection(fi.DirectoryName, false)) { string tempfile = tempfiles.AddExtension(fi.Extension, false); //if (fi.Exists) //{ // File.Copy(file, tempfile); // FileAttributes tattr = File.GetAttributes(tempfile); // tattr &= ~FileAttributes.ReadOnly; // File.SetAttributes(tempfile, tattr); //} Type t = o.GetType(); PropertyInfo[] pis = t.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.GetField | BindingFlags.SetField); Dictionary <string, string> existingEntries = GetIniSectionDictionary(section, file); foreach (PropertyInfo pi in pis) { try { DontSerializeAttribute[] fields = (DontSerializeAttribute[])pi.GetCustomAttributes(typeof(DontSerializeAttribute), true); if (fields.Length == 0) { bool hassetandget = pi.CanRead & pi.CanWrite; //if (hassetandget) { object v = pi.GetValue(o, null); string key = pi.Name; string inival = StringConverter.ConvertToString(v); string defval = ""; DefaultValueAttribute[] defvalfields = (DefaultValueAttribute[])pi.GetCustomAttributes(typeof(DefaultValueAttribute), true); if (defvalfields.Length > 0) { if (defvalfields[0].Value != null) { defval = StringConverter.ConvertToString(defvalfields[0].Value); } } string curinival = GetIniSectionValuefromDictionary(existingEntries, key, defval);//Ini.sGetPrivateProfileString(section, key, tempfile, defval); if ((curinival != inival) || SaveDefaultValues) { if (changesToIni == false) { changesToIni = true; if (fi.Exists) { File.Copy(file, tempfile); FileAttributes tattr = File.GetAttributes(tempfile); if ((tattr & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) { tattr &= ~FileAttributes.ReadOnly; File.SetAttributes(tempfile, tattr); } } } Ini.WritePrivateProfileString(section, key, inival, tempfile); } } } } catch (Exception exc) { MsgBox.ShowException(exc); } } if (changesToIni) { //make a backup of the original file DateTime now = DateTime.Now; string datesuffix = string.Format("{0:00}{1:00}{2:00}{3:00}{4:00}", now.Month, now.Day, now.Year, now.Hour, now.Minute); //make a backup of the original file string backupfile = Path.Combine(BackupFolder.Path, Path.GetFileName(file) + ".BACKUP" + datesuffix); if (fi.Exists) { // check for read only flag, remove it if needed if (makebackupfile) { if (File.Exists(backupfile)) { FileAttributes attr = File.GetAttributes(backupfile); attr &= ~FileAttributes.ReadOnly; File.SetAttributes(backupfile, attr); } File.Copy(file, backupfile, true); File.SetAttributes(backupfile, FileAttributes.ReadOnly); } fi.Delete(); } //if we got here, then we should be OK if (File.Exists(tempfile)) { File.Move(tempfile, file); } tempfiles.Delete(); } } } }