/// <summary>
    /// 向ini文件中写入数据或存入数据
    /// </summary>
    public class IniFile
    {
        [DllImport("kernel32")]
        private static extern int GetPrivateProfileString(string lpAppName, string lpKeyName,
         string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);        [DllImport("kernel32")]
        private static extern bool WritePrivateProfileString(string lpAppName,
         string lpKeyName, string lpString, string lpFileName);        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="iniFileName">INI文件名</param>
        public IniFile(string iniFileName)
        {
            this.iniFileName = iniFileName;
        }        /// <summary>
        /// 读取ini文件数据
        /// </summary>
        /// <param name="section">节点名,例如[schema]</param>
        /// <param name="key">键名</param>
        /// <param name="nDefault">键值的默认值,若未读取数据,用该值取代</param>
        /// <returns>键值</returns>
        public string ReadIni(string section, string key, string nDefault)
        {
            StringBuilder tmp = new StringBuilder(1024);
            int rec = GetPrivateProfileString(section, key, nDefault, tmp, 1024, this.iniFileName);
            return tmp.ToString();
        }        /// <summary>
        /// 向ini文件中写入数据
        /// </summary>
        /// <param name="section">节点名,例如[schema]</param>
        /// <param name="key">键名</param>
        /// <param name="strVal">键值</param>
        public void WriteIni(string section, string key, string strVal)
        {
            WritePrivateProfileString(section, key, strVal, this.iniFileName);
        }        private string iniFileName;
    }
}
用WritePrivateProfileString(section, key, strVal, this.iniFileName);这个函数网ini文件里写东西,在section, key,this.iniFileName都相同的情况下,为什么每次都是增加记录,而不是覆盖原有的数据,求解答,我只想覆盖,并不是添加

解决方案 »

  1.   

    可能是你的构造函数有问题,用下面 代码代替试试:        //类的构造函数,传递INI文件名
            public IniFiles(string AFileName)
            {
                // 判断文件是否存在
                FileInfo fileInfo = new FileInfo(AFileName);
                //Todo:搞清枚举的用法
                if ((!fileInfo.Exists))
                { //|| (FileAttributes.Directory in fileInfo.Attributes))
                    //文件不存在,建立文件
                    System.IO.StreamWriter sw = new System.IO.StreamWriter(AFileName, false, System.Text.Encoding.Default);
                    try
                    {
                        sw.Write("Test.");
                        sw.Close();
                    }
                    catch
                    {
                        throw (new ApplicationException("Ini文件不存在"));
                    }
                }
                //必须是完全路径,不能是相对路径
                FileName = fileInfo.FullName;
            }
      

  2.   

    个人觉得用C#写一个比用Win32API更方便
      

  3.   

    WritePrivateProfileString(section, key, strVal, this.iniFileName)楼主确保其中的section key是一样的吗?我这样用,是没有问题的
      

  4.   

    我试了一下可以的
    ini文件内容:
    [DBCFG]
    ;阿打扫打扫
    IPTFPath =qqqqq[DllImport("kernel32")]
            private static extern int GetPrivateProfileString(string lpAppName, string lpKeyName,
            string lpDefault, StringBuilder lpReturnedString, int nSize, string lpFileName);        [DllImport("kernel32")]
            private static extern bool WritePrivateProfileString(string lpAppName,
            string lpKeyName, string lpString, string lpFileName);
            static void Main(string[] args)
            {            WriteString("DBCFG", "IPTFPath", "asdasd",AppDomain.CurrentDomain.BaseDirectory + "typhoonPath.ini");        }
            //写INI文件 
            public static void WriteString(string Section, string Ident, string Value,string FileName)
            {
                if (!WritePrivateProfileString(Section, Ident, Value, FileName))
                {                throw (new ApplicationException("写Ini文件出错"));
                }
            } 
    运行后ini文件的内容就变成“asdasd”了。
      

  5.   

    问题解决,谢谢,是因为节点名的原因,节点名我是命名为[paramset],把括号去掉就OK了