Exemple #1
0
        /// <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();
                }
            }
        }
Exemple #2
0
        /// <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();
                    }
                }
            }
        }