using System;
using System.Text;
using System.Runtime.InteropServices;
using System.IO;
/*
 * INI文件操作类
 */
namespace ManageTools
{
    public class INIFile
    {
        public delegate void EventHandler(object sender, EventArgs e);
        public event EventHandler IniFileChanged;
        public event EventHandler Initialization;
        protected string IniFileName;
        public INIFile(string FileName)
        {
            IniFileName = FileName;
        }
        public string FileName
        {
            get
            {
                return IniFileName;
            }
            set
            {
                if (value != IniFileName)
                {
                    IniFileName = value;
                    OnIniFileChanged(new EventArgs());
                }
            }
        }

        protected void OnIniFileChanged(EventArgs e)
        {
            if (IniFileChanged != null)
                IniFileChanged(null, e);
        }
        protected void OnInitialization(EventArgs e)
        {
            if (Initialization != null)
                Initialization(null, e);
        }

        public void WriteValue(string Section, string Key, string Value)
        {
            WritePrivateProfileString(Section, Key, Value, this.IniFileName);
        }

        public string ReadValue(string Section, string Key, string Default)
        {
            StringBuilder temp = new StringBuilder(500);
            int i = GetPrivateProfileString(Section, Key, Default, temp, 500, this.IniFileName);
            return temp.ToString();
        }

        private void NewDirectory(String path)
        {
            if (!Directory.Exists(path))
            {
                Directory.CreateDirectory(path);
            }
        }

        // 文件尾增加
        public void AddNotes(string Notes)
        {
            string filename = IniFileName;
            string path;
            path = Directory.GetParent(filename).ToString();
            NewDirectory(path);
            FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter sw = new StreamWriter(fs);
            sw.BaseStream.Seek(0, SeekOrigin.End);
            sw.WriteLine(@";" + Notes);
            sw.Flush();
            sw.Close();
            fs.Close();
            sw.Dispose();
            fs.Dispose();
        }
        // 文件尾增加
        public void AddText(string Text)
        {
            string filename = IniFileName;
            string path;
            path = Directory.GetParent(filename).ToString();
            NewDirectory(path);
            FileStream fs = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Write);
            StreamWriter sw = new StreamWriter(fs);
            sw.BaseStream.Seek(0, SeekOrigin.End);
            sw.WriteLine(Text);
            sw.Flush();
            sw.Close();
            fs.Close();
            sw.Dispose();
            fs.Dispose();
        }

        #region 重载
        public void WriteValue(string Section, string Key, int Value)
        {
            WriteValue(Section, Key, Value.ToString());
        }
        public void WriteValue(string Section, string Key, Boolean Value)
        {
            WriteValue(Section, Key, Value.ToString());
        }
        public void WriteValue(string Section, string Key, DateTime Value)
        {
            WriteValue(Section, Key, Value.ToString());
        }
        public void WriteValue(string Section, string Key, object Value)
        {
            WriteValue(Section, Key, Value.ToString());
        }
        public int ReadValue(string Section, string Key, int Default)
        {
            return Convert.ToInt32(ReadValue(Section, Key, Default.ToString()));
        }

        public bool ReadValue(string Section, string Key, bool Default)
        {
            return Convert.ToBoolean(ReadValue(Section, Key, Default.ToString()));
        }


        public DateTime ReadValue(string Section, string Key, DateTime Default)
        {
            return Convert.ToDateTime(ReadValue(Section, Key, Default.ToString()));
        }


        public string ReadValue(string Section, string Key)
        {
            return ReadValue(Section, Key, "");
        }
        #endregion
        /*
    section: 要写入的段落名
    key: 要写入的键，如果该key存在则覆盖写入
    val: key所对应的值
    filePath: INI文件的完整路径和文件名
    */
        [DllImport("kernel32")]
        private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);

        /*
        section：要读取的段落名
        key: 要读取的键
        defVal: 读取异常的情况下的缺省值
        retVal: key所对应的值，如果该key不存在则返回空值
        size: 值允许的大小
        filePath: INI文件的完整路径和文件名

        */
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string section, string key, string defVal, System.Text.StringBuilder retVal, int size, string filePath);

    }
}
